21/02/25 09:20:14.64 ZyJLXTlk.net
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
前スレ: シェルスクリプト総合 その35
スレリンク(tech板)
関連スレ
・【Bash】Windows Subsystem for Linux【WSL】9
スレリンク(linux板)
・Bashでプログラミング [転載禁止](c)2ch.net
スレリンク(linux板)
・シェルスクリプト総合 その28
スレリンク(unix板)
・zsh その7
スレリンク(unix板)
・過去UNIXで使われていた ksh というシェルについて
スレリンク(unix板)
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
スレリンク(unix板)
・おまえら! shell は何を使っているんですか?
スレリンク(unix板)
2:デフォルトの名無しさん
21/02/25 09:20:36.91 ZyJLXTlk.net
・特記なき場合、POSIX準拠シェルが既定です(古きBourneシェルはほぼ絶滅しました)
POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
参考 URLリンク(unix.stackexchange.com)
特定のシェルの専用機能に依存する場合は明示しましょう(特にPOSIX準拠シェルではないfish, (t)csh等)
・POSIX準拠シェルのおすすめは?→多く使われているのはDebian/Ubuntu系のdashです
・bashでいいじゃん→bashがインストールされてない環境があります。環境によってデフォルトシェルの実体は異なります
Debian系 … dash CentOS系 … bash Alpine … busybox ash An
3:droid … mksh FreeBSD … ash Solaris,OpenBSD … ksh macOS … bash(Single UNIX Specification準拠のために一部動作が異なる) ・macOSはzshなんだよね?→ログインシェルがzshに変わっただけで/bin/shはbash 3.2です ・シェルスクリプトは可搬性を持たせるために可能な限りPOSIXに準拠しましょう 仕様 http://pubs.opengroup.org/onlinepubs/9699919799/ ・シバンになにを使えばいいの?→POSIX準拠してるなら#!/bin/sh、bashなら#!/bin/bashか#!/usr/bin/env bash ・bash依存はなるべく避けましょう。自覚なきbashism。シバンが#!/bin/shなのにbashに依存する構文を使っていませんか? ・Bourneシェル(≒POSIXシェル)はPOSIX標準化前にUNIXで使われていたシェルで多くの亜種が存在します Version 7 UNIXのshに一番近いのはOpenSolaris由来のHeirloom Bourne Shell、次点でSchily Bourne Shellのoboshです Heirloom Bourne Shell: sh http://heirloom.sourceforge.net/sh.html Schily Bourne Shell: obosh http://schilytools.sourceforge.net/bosh.html 歴史的資料 https://www.in-ulm.de/~mascheck/ ・csh/tcshでのシェルスクリプトは*まったく推奨しません* 参考 http://www.speech-lab.org/~hiroki/csh-whynot.euc ・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう ・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ ・シェル芸とシェルスクリプトは全く異なります ・シェルスクリプトのことをシェルってゆうな
4:デフォルトの名無しさん
21/02/25 18:11:17.11 w3Ud6BUK.net
知ってるガススタのことだよね
5:デフォルトの名無しさん
21/02/26 02:56:16.05 BSvPs2+3.net
資源メジャーをカススタとか、視野の狭い奴は生きてて恥ずかしくないのかな
6:デフォルトの名無しさん
21/02/28 14:32:38.25 BgTYpoJY.net
なんだか誤解を招く表現ばかりだけど、
URLリンク(gigazine.net)
2GBをzip圧縮するような重たい処理を並列化する場合は、pthreadよりxargsのほうが、"僅かに"有利なようだ
7:デフォルトの名無しさん
21/02/28 14:53:29.82 797yScED.net
xargsやparallelのほうが簡単
job control的にはparallelのほうが優れてたはず
8:デフォルトの名無しさん
21/02/28 14:54:49.97 JYcgL82Q.net
xargsってPOSIXでは作れない機能でも使ってるの?
xargsってFreeBSDでもmacOSでも動くよね?
9:デフォルトの名無しさん
21/02/28 15:01:05.15 XNBptB7O.net
>>5
> 2GBをzip圧縮するような重たい処理を並列化する場合は、pthreadよりxargsのほうが、"僅かに"有利なようだ
当たり前じゃね? スレッド切り替えのオーバーヘッドがないんだから
マルチコア(マルチCPU)なら複数プロセスで実行したほうが速いでしょ?
10:デフォルトの名無しさん
21/02/28 15:07:08.34 XNBptB7O.net
つまりこれはマルチスレッド vs マルチプロセスの話で
一般的にはマルチスレッドの方がパフォーマンスは良いが
マルチスレッドだと共有リソースの排他制御などをする必要があるから
共有リソースがない場合はマルチプロセスのほうがパフォーマンスが良くて
POSIXとはなんの関係もないよねって意味ね
11:デフォルトの名無しさん
21/02/28 15:11:12.46 XNBptB7O.net
>>5
> 2GBをzip圧縮するような重たい処理を並列化する場合は
2GB・・・関係ない
zip圧縮・・・関係ない
重たい処理・・・関係ない
> pthreadよりxargsのほうが、"僅かに"有利なようだ
xargs・・・関係ない
共有リソースがなくて排他制御をする必要がない処理を並列化する場合は
マルチスレッドよりマルチプロセスで実装したほうが、"僅かに"有利なようだ
これが正しいかな
12:デフォルトの名無しさん
21/02/28 15:15:22.13 0S62sz9G.net
POSIXによって能力を制限されてるって書いてあるけど
URLリンク(linuxjm.osdn.jp)
> POSIX.1c
> IEEE Std 1003.1c-1995. POSIX スレッドインターフェースについて記載している。
POSIXスレッドは1995年?ぐらいに登場した新しいPOSIXで
xargsで使われてるマルチプロセスはずっと前から使えるPOSIXじゃん?
POSIXで実装されてるのにPOSIXで能力を制限とか意味わからん
13:デフォルトの名無しさん
21/02/28 15:21:32.20 VQYtUoBE.net
>>8
やりかたしだいやろ。
Apacheなんかは、マルチプロセスモデルよりもマルチスレッドなイベントモデルのほうが(一部を除いて)パフォーマンスが高いとされてる。
14:デフォルトの名無しさん
21/02/28 15:31:23.99 N8V7r+yZ.net
Apache(とか)はfork+execのオーバーヘッドが無視できないってのだな
処理単位が1秒以内とかで済む、処理単位がガシガシ来るなら当然
でもまあ>>8は間違ってるかな。>>9で訂正してるようだけど
15:デフォルトの名無しさん
21/02/28 16:02:00.25 CBZyHOS6.net
外国にもPOSIXを勘違いして解釈したPOSIX中心主義みたいな奴がいるんか?w
POSIXは主にC言語のインターフェースなんだから、POSIXで標準化されたコマンド以外でも
POSIXインターフェースを使って作られたコマンドもPOSIXに準拠してることになるんだって
POSIXは、POSIXで規定されたコマンドだけを使って
それ以外はシェルスクリプトで独自開発しましょうって規格じゃねーだろ?
POSIXのC言語のインターフェース使ってコマンド使ってもいいだろ?
そして自分じゃなくて誰かがOSSとかで作ったコマンドもバンバン使っていいだろ?
可搬性?OSSなら可搬性あるるからどこでも使えるコマンドだろ
16:デフォルトの名無しさん
21/02/28 17:07:15.88 qG6bavOU.net
>>10
もしも時間のかからない処理だったら、プロセス生成にかかるコスト差のほうが上回るんじゃね?
17:デフォルトの名無しさん
21/02/28 20:14:25.47 O8DyCWfa.net
これどうなんだろ、xargsの方は1プロセス1ファイルだけど、pigzは複数スレッド1ファイル
なんでしょ。
だったらpigzも1スレッド1ファイルで複数ファイルを同時処理するモードがあればどうなのかと。
いずれにせよ元の話はいろんな条件が混ざっていて気持ち悪い感じがする。
18:デフォルトの名無しさん
21/02/28 20:17:39.23 O8DyCWfa.net
GNUのxargsというのでじゃあPOSIXのxargsを考えると、
POSIXのxargsだと例えば引数の数を1にしても(-n1)、プロセスが並列には走らないのか。
waitを使うようなシェルスクリプトとかでGNU xargsの-Pと似たようなことはできるかな?
というわけでこのスレ的な流れに持っていけるかな? w
19:デフォルトの名無しさん
21/02/28 20:27:29.22 pff3D6mj.net
可哀想なのがおるな
20:デフォルトの名無しさん
21/03/01 03:10:12.92 UPXhvHyB.net
>>17
xargsはPOSIXじゃないぞ
21:デフォルトの名無しさん
21/03/01 03:28:09.40 RTWwkQ1E.net
URLリンク(pubs.opengroup.org)
22:デフォルトの名無しさん
21/03/01 03:34:18.55 UPXhvHyB.net
あ、POSIXにあるのかw
ってことはxargsは使っていいけど-Pは
POSIXじゃないから使わないって言ってるのか?
ほんとPOSIX中心主義みたいなこと言ってるなw
23:デフォルトの名無しさん
21/03/02 15:59:01.27 NSMtG/TQ.net
この部分がどうしても繋がりません
if [ {find "$line" -maxdepth 1 -mindepth 1 -type d | wc -lc } -eq 0 ] ; then
echo "hoge"
fi
これがどうしても出来ません
find "$line" -maxdepth 1 -mindepth 1 -type d | wc -lcだけだと出来るんですが、それを演算式に繋げようとすると私が思いつく限りは何をどういじっても動きません
パイプを更に不等式で繋げるのがよくないと思うんですが
どうしたら直りますか?
24:デフォルトの名無しさん
21/03/02 16:47:44.09 5tuGRxIW.net
$()
25:デフォルトの名無しさん
21/03/02 16:50:56.84 kOL3oDu9.net
>>22
{}じやなくて、$()なんじゃないの?
標準出力の内容と「0」を比較するのなら。
26:デフォルトの名無しさん
21/03/02 16:55:13.39 kOL3oDu9.net
まけた。。。
ちなみに、"$()"のほうが安心。
27:デフォルトの名無しさん
21/03/02 17:15:53.31 qy7/OUMA.net
だがwcを使うのがイケてない
28:デフォルトの名無しさん
21/03/02 17:24:52.22 5tuGRxIW.net
wcだと改行コードがね
29:デフォルトの名無しさん
21/03/02 18:08:15.82 qy7/OUMA.net
$ printf abc | wc -l
0
こうなるって話?
行数を数えるより良いロジックはなんだろうか
30:デフォルトの名無しさん
21/03/02 18:29:23.93 bIA4j74d.net
何にも該当するのがないかどうかって判断でしかないのに、余計なこと考えたんじゃね
wcを使うのがイケてないって他の行数を数える方法でなのか??
単に出力があるか無いかだけでかと思った
31:デフォルトの名無しさん
21/03/02 18:41:11.07 bIA4j74d.net
-lc ってどっちやねんもあるか。それか?いや違うか
どっちかにしろってのは存在してるけど
32:デフォルトの名無しさん
21/03/02 18:47:50.24 NSMtG/TQ.net
おお!
なんかエラーがそれっぽくなって近づきました
エスケープ文字で引っかかってる感じですけど
ありがとうです
33:デフォルトの名無しさん
21/03/02 18:54:51.13 NSMtG/TQ.net
すいません
-lcのcはいつの間にか間違えて入ってしまってたみたいです
ただのミスです
申し訳ない
34:デフォルトの名無しさん
21/03/02 18:57:13.79 bIA4j74d.net
なる。いや、謝るほどでもない。でも、まあ、いいなその姿勢w
頑張れ
35:デフォルトの名無しさん
21/03/02 18:57:26.63 NSMtG/TQ.net
0にしてるのは簡易的なテストで
フォルダが1かつファイルが0ならば下層フォルダの階層を全部あげようとしてた感じでした
これもまたもっと良い方法があるのかもしれまん?
36:デフォルトの名無しさん
21/03/02 20:26:31.82 1DoNrFvk.net
$ printf abc | grep -c .
でええんちゃうちゃう
37:デフォルトの名無しさん
21/03/02 20:28:20.11 1DoNrFvk.net
あ、間違えた
$ printf abc | grep -c ''
だった
38:デフォルトの名無しさん
21/03/02 21:37:15.67 11FPPCA/.net
>>34
>フォルダが1かつファイルが0
??
>下層フォルダの階層を全部あげようとしてた
?
調べるフォルダで内包するのがファイルも無くフォルダ一つ
って言っていることになると思うけど
ありそうなのは、中身空っぽのフォルダ だけど、それとは違うのか
調べるフォルダ(始点のフォルダ)直下のフォルダだけでなくそれ以下の階層でもの空のフォルダを探そうとしてる
ってことなのかなあ
39:デフォルトの名無しさん
21/03/02 21:38:12.22 gQx0ks5j.net
KARA「呼んだ?」
40:デフォルトの名無しさん
21/03/07 19:26:32.91 T3tOQ7Z+.net
こんな感じで
if [ "$source_line_10_first" -ne "$source_line_10_after" ] ; then
i=40
fi
ソースを引っ張ってきて比較するんですが、ソースはやはりエスケープ文字が多いので失敗します
シングルクォテーションでも思いつく限り括弧で括ってもダメでした
変数のエスケープ文字を無視する方法は何か無いですか?
41:デフォルトの名無しさん
21/03/07 19:40:15.82 vyuBuDwH.net
>>39
下手なやつが試行錯誤するんじぇねーよ
何がダメかちゃんと書いてるだろうが
42:デフォルトの名無しさん
21/03/07 19:49:06.84 UqHHohgI.net
文字列に元々含まれてるシングルクォートだけ"で囲って
あとは文字列全体をシングルクォートで囲めばいいのでは
43:デフォルトの名無しさん
21/03/07 19:54:42.49 abZnd7wd.net
コンピューターサイエンスの難問:
・命名
・オフバイワン
・キャッシュインバリデーション
・文字のエスケープ(New!)
44:デフォルトの名無しさん
21/03/07 20:00:22.61 quYd9iFF.net
>>39
その変数はどうやって設定してんの?
変数にいれなきゃダメなの?
cmp < <(...) < <(...)
とか、一時ファイル経由じゃダメなの?
45:デフォルトの名無しさん
21/03/07 20:09:21.95 vyuBuDwH.net
答える方もアホばかりやなw
素人がエスケープが~と言っていたからって
それが原因だと思うな
46:デフォルトの名無しさん
21/03/07 20:41:29.78 PBQIZrIy.net
>>39
質問がよくわからんのだが -ne (数値比較であって文字列比較ではない) の
使い方は意図通りなの?
47:デフォルトの名無しさん
21/03/07 20:43:03.31 vyuBuDwH.net
素人の質問を真に受けるな、相手に情報を出させろ。アホどもが
48:デフォルトの名無しさん
21/03/07 21:28:47.98 UPuiYP7U.net
後で自分がわかったから偉そうにする馬鹿
49:デフォルトの名無しさん
21/03/07 23:47:36.62 T3tOQ7Z+.net
>>45
うわ、バッチリ出来ました
ほんとアホでした
ありがとうございます
50:デフォルトの名無しさん
21/03/08 03:27:47.81 3+uDlPP2.net
だから最初から出力されてるエラーメッセージをわかると書いただろ
51:デフォルトの名無しさん
21/03/08 09:59:07.99 6lKYXbK2.net
>>49
人にやかましく言う前に、まともな日本語を書け!
52:デフォルトの名無しさん
21/03/08 10:09:07.56 3+uDlPP2.net
> ソースを引っ張ってきて比較するんですが
ソースを引っ張ってくるとは?
> ソースはやはりエスケープ文字が多いので失敗します
ソースにエスケープが多いとは
> シングルクォテーションでも思いつく限り括弧で括ってもダメでした
思いつきで書くんじゃなくて、正しい書き方を学べ
> 変数のエスケープ文字を無視する方法は何か無いですか?
変数のエスケープ文字とか意味が全くわからない
この初心者の意味不明な文章を真に受けて
レスするやつがいるんだもんなぁ
アホかと
53:デフォルトの名無しさん
21/03/08 13:04:09.36 OXaKjPz6.net
結局あんなにレスしてるのに一つとしてまともな文を書けないのな
54:デフォルトの名無しさん
21/03/08 13:04:45.87 QR/il1w1.net
>>51
お前の指摘は「-eq を理解している事 前提」なんだよ
右も左もわからん奴は中学生レベルの英語のエラーメッセージを読む精神的な
余裕が無かったり、読んでも正しく解釈できない
お前のやり方は抽象的過ぎるわ「情報小出しにするな」的な基本でもないわで相手に全く届かず
会話に参加できていない
幾ら吠えてもムダ
55:デフォルトの名無しさん
21/03/08 21:43:41.10 vBncgnCM.net
ある文字1文字が標準入力で与えられたときに
その文字がサロゲートペアであるかを判定するシェルスクリプトを教えてください
56:デフォルトの名無しさん
21/03/08 21:49:20.34 eBezB7N7.net
文字はodコマンドで1バイトずつに変換できる
あとはその数値を調べればいいだけ
57:デフォルトの名無しさん
21/03/08 21:58:22.39 0PSdEx+k.net
>>54
| 判定するプログラム
58:デフォルトの名無しさん
21/03/09 01:18:57.53 GjAck/b0.net
文字って正確には何のことじゃいな?
59:デフォルトの名無しさん
21/03/09 03:38:34.14 O1t/zxF9.net
コンピューターサイエンスの難問:
・命名
・オフバイワン
・キャッシュインバリデーション
・文字エンコーディング(New!)
60:デフォルトの名無しさん
21/03/10 14:30:06.19 4EdeRuF3.net
!r posix shell
をDuckduckgoで検索
61:デフォルトの名無しさん
21/03/16 18:28:13.75 KSYjhM+z.net
行頭の任意の数の特定文字を、同じ数の別の特定文字に、sedで置換する方法はあるかな?
たとえば、次のようなテキストを
a aaa
aa aa
aaa a
次のように変更したい。
A aaa
AA aa
AAA a
次のようにだらだら書いたらできるけど、めんどくさいし、任意の数に対応できない。。。
s/^a¥s/A/;
s/^aa¥s/AA/;
s/^aaa¥s/AAA/;
...
62:デフォルトの名無しさん
21/03/16 18:57:27.90 4E4BJCoI.net
IPF="対象のファイル.txt"
OPF="結果を出力するファイル.txt"
#最初のフィールドを抜き出し、aをAに変換
cat ${IPF} | cut -d' ' -f1-1 | sed -e "s/a/A/gi" > /tmp/$$0
#残りのフィールドを抜き出す
cat ${IPF} | cut -d' ' -f2-128 > /tmp/$$1
#同列行を連結
paste -d " " /tmp/$$0 /tmp/$$1 > ${OPF}
rm -f /tmp/$$*
63:60
21/03/16 19:53:28.48 KSYjhM+z.net
>>61
いや、サンプルはああ書いたけど、実際はフィールド的じゃない。
任意のテキストも混じってるから、cutはちょっと。。。
sedで任意個→任意個の置換は、やっぱりムリ?
64:デフォルトの名無しさん
21/03/16 19:53:49.41 37ClWGtj.net
'h;s/ .*//;s/a/A/g;x;s/^[^ ]*//;H;g;s/\n//'
65:デフォルトの名無しさん
21/03/16 20:44:06.60 Uw3qDZze.net
':b;s/^\(A*\)a/\1A/g;tb'
66:デフォルトの名無しさん
21/03/16 23:16:18.12 cOTzxoWO.net
仕様を後出しするなカス
67:デフォルトの名無しさん
21/03/16 23:29:02.91 iNI2JLkI.net
$ echo 'aa@aa' | sed -E '/^(a+)/!b;s/^(a+)(.*)\n/\1\n\2/;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
aa@AA
$ echo 'aabbb' | sed -E '/^(a+)/!b;s/^(a+)(.*)\n/\1\n\2/;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
AAbbb
68:デフォルトの名無しさん
21/03/16 23:31:10.17 iNI2JLkI.net
>>66
最初の方、aa@AA じゃなくて AA@aa だわ
69:デフォルトの名無しさん
21/03/16 23:40:46.05 iNI2JLkI.net
考えてみたら
'/^(a+)/!b;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
でええかな…
70:60
21/03/16 23:57:21.97 KSYjhM+z.net
回答、ありがと!
>>63
>>68
要はホールドスペースか。。。
ちぎって置換する感じやな。
いまひとつわかってないので、後で調べて確認してみるわ。
71:60
21/03/16 23:58:40.36 KSYjhM+z.net
>>65
要件はちゃんと書いてあるやろが!カス!
72:デフォルトの名無しさん
21/03/17 00:55:43.47 ORBKE+6f.net
>>70
どこに?
73:デフォルトの名無しさん
21/03/17 00:59:05.62 8tt0N3Ix.net
perl -pe 's/^(a*\s)/$1=~s|a|A|rg/e'
74:デフォルトの名無しさん
21/03/17 02:07:36.90 MY4kqLB8.net
yafiygi
75:デフォルトの名無しさん
21/03/18 22:37:09.67 TQ/yKLr3.net
パイプとリダイレクトなんだけど、どっちを使ったほうがいいとかありますか?
1は cat のプロセスが生成されるだけ無駄なのかな
1. cat file1 | wc
2. wc < file1
76:デフォルトの名無しさん
21/03/18 22:38:55.72 TQ/yKLr3.net
連レスすまそ
手癖で1をやっちゃうんだけど、こういう時にまずいとかあったら教えてほしい感じです
77:デフォルトの名無しさん
21/03/18 22:47:23.96 3HmhYQS2.net
ないだろう
別次元で
cat file | read a
read a < file
aをなんかする
とかならあるけど
cat file | は古典的定番で今でも悪でもないだろう
78:デフォルトの名無しさん
21/03/18 22:54:13.26 3HmhYQS2.net
URLリンク(ja.wikipedia.org)(UNIX)
なんかウザいw
1995年からそんなのあったんだ
あんま普及してなさそ
wc < file1
も古典だって
<file1 wc
だって。ウザいなw
79:デフォルトの名無しさん
21/03/18 23:06:25.59 TQ/yKLr3.net
気にしすぎか、ありがとう!
> cat > newfile
> 新規ファイルnewfileを作成もしくは上書きして、入力したい内容を打ち込み、CTRL+Dコマンドで終了する。入力された内容は新規ファイルに書き込まれる。
これ知らなかったな、同じことをやりたい時は cat << EOF > newfile してたぜ
80:デフォルトの名無しさん
21/03/19 00:06:34.36 vJ8/R89b.net
Useless use of cat (UUOC)
昔から有名だな
catなんか使うもんじゃない
81:デフォルトの名無しさん
21/03/19 00:09:26.01 vJ8/R89b.net
>>74
> 1. cat file1 | wc
> 2. wc < file1
明らかに2の方が良い
> cat file | read a
> read a < file
特にこの2つだと後者のほうが圧倒的に速い
なぜならcatを使うとシーク不可能になるから
1バイトずつの読み込みになる
< file だとシーク可能だから一定のサイズで読み込むので速い
82:デフォルトの名無しさん
21/03/19 00:15:10.62 gmXrz9Hk.net
ウザいのが出たよw
83:デフォルトの名無しさん
21/03/19 00:17:10.15 gmXrz9Hk.net
>なぜならcatを使うとシーク不可能になるから~
www
何言ってるんだか
84:デフォルトの名無しさん
21/03/19 00:17:28.82 vJ8/R89b.net
ウザいのはあなたの感想ですよね
事実の話をしましょう
85:デフォルトの名無しさん
21/03/19 00:18:15.17 vJ8/R89b.net
>>82
恥ずかしくないの?
sh の組み込みコマンド read は遅い
URLリンク(www.allbsd.org)
86:デフォルトの名無しさん
21/03/19 00:19:26.55 vJ8/R89b.net
> 改善するには
ここまで読んで、「最初の shcat の例とコードが違うのでは」と気づいたひとがいるかも知れない。
> 文頭では、次のような例として紹介した。
>
> shcat() { while read L; do echo "$L"; done; }
>
> shcat < foo
> 当たり前だが、こちらは cat(1) を使っていない。先ほどのベンチマークは cat(1) を使っていたので、
> 入力をリダイレクトにしてみよう。
> 実は、シェルの実装によってはシーク可能な記述子を read(2) が読む場合に限り、
> システムコールのバッファを増やすという最適化が入っている。前述したとおり、r
> ead 組み込みコマンドは改行文字を飛び越さないために、1 文字ずつ読む必要がある。
> しかし読む対象がファイルであれば、ランダムアクセスできるので読み出す位置は自由に設定できる。
> そのため、read(2) で大きめに読み込んでから改行文字を探し、その直後に読み出し位置を
> 再設定すれば 1 文字ずつ read(2) を呼び出す必要はない。
87:デフォルトの名無しさん
21/03/19 00:20:25.38 gmXrz9Hk.net
www
わざわざ煽って出してきたのが、
自分が何も理解してませんという証明にしかなってないという
88:デフォルトの名無しさん
21/03/19 00:21:37.14 gmXrz9Hk.net
連投して抽出までしてるのにww
何も理解してませんという証明にしかなってないよ
89:デフォルトの名無しさん
21/03/19 00:22:02.15 vJ8/R89b.net
>>86
なにか言い返す言葉があるなら言い返してみてよ
90:デフォルトの名無しさん
21/03/19 00:23:55.24 gmXrz9Hk.net
偉そうな馬鹿に教えてやるとでも思ってるのか
そんな煽りでとかも思ってそうだな、とことん甘ちゃんだな
それと、いつものが確定してんぞw
91:デフォルトの名無しさん
21/03/19 00:26:19.51 vJ8/R89b.net
自分からいつものやつだって自白してらw
92:デフォルトの名無しさん
21/03/19 00:28:27.48 gmXrz9Hk.net
アホな返しっぷりがまたこれがまた、いつものパターンという...w
93:デフォルトの名無しさん
21/03/19 02:10:05.59 qP05xHwq.net
いつもの2人やな
94:デフォルトの名無しさん
21/03/19 02:17:31.73 7j/6ICPv.net
トムとジェリー仲良く喧嘩しな~♪
95:デフォルトの名無しさん
21/03/19 04:05:22.98 RMQx/osX.net
catよりパロディのtacの方がオプションモリモリでcat以上に乱用されてるよな…
96:デフォルトの名無しさん
21/03/19 04:19:36.74 L0TmvpAG.net
>>74
catのプロセス分のリソースも無駄だが、
コンテキストスイッチが多発するのが良くない
97:デフォルトの名無しさん
21/03/19 12:05:21.82 8EGHMbin.net
$ cat << EOL > file1
> foo
> bar
> EOF
これでヒアドキュメントを使った複数行テキストの書き込みはできるんだけど、
cat を使わないようにするのって可能なのかな
98:デフォルトの名無しさん
21/03/19 12:06:22.99 8EGHMbin.net
>>96 s/EOF/EOL/
99:デフォルトの名無しさん
21/03/19 12:13:54.81 UA/QoJ1s.net
エンドオブライフ
100:デフォルトの名無しさん
21/03/19 13:27:42.94 8EGHMbin.net
tee を使えば行けることに気付いたけど、cat が減っても tee が出てきたら意味ないよね
そもそも数行程度で cat を無理に外す必要はないことに気付いた
忘れてくれ
101:デフォルトの名無しさん
21/03/19 15:51:37.59 R0IdNopV.net
echo ... >file
でええがな。w
シェルビルトインコマンドやし、ちょっと軽い。
102:デフォルトの名無しさん
21/03/19 16:55:09.45 MDPOlxpG.net
>>96
ちょっと上に出てきたshcatからわかるように
catはほぼ同等のものをシェルスクリプトで実装できる
(ファイルにNULL文字や不正な文字が入ってる場合に少し異なる)
ただし行数が多くなるとループ処理の回数も増えるので
遅いシェルスクリプトよりもcatの方が良い
ちなみにこんな感じね
while IFS= read -r line; do
printf '%s\n' "$line"
done << EOW > file1
foo
bar
EOW
103:デフォルトの名無しさん
21/03/19 16:56:26.33 DiNJqFEB.net
それでいいなら最初からそうしてるんじゃないか。知らんけど。
104:102
21/03/19 16:59:34.18 DiNJqFEB.net
おっと、>>102 は >>101 じゃなくて >>100 に対してだよ。
105:デフォルトの名無しさん
21/03/19 18:57:42.69 RMQx/osX.net
>>84
比べてないがその用途にmapfileがビルトインなんじゃないの、標準かは知らんけど
106:デフォルトの名無しさん
21/03/19 19:00:37.39 RMQx/osX.net
ああ配列使うんだから標準なわけないか
ストリームじゃないからクソデカだと困るか
でも手放せない
107:デフォルトの名無しさん
21/03/23 17:53:11.07 laboXhIZ.net
0、標準入力
1、標準出力
2、標準エラー出力
ですよね?
cat <&0 ってやってなんか文字打ったら
標準入力から入力したものを標準出力に出力するから
入力した行と同じ行が出力されるのはわかるんですが
なんで cat <&2 ってやっても同じように
入力した行と同じ行が出力されるんです?
標準エラー出力から入力するってどういう意味なんです?
108:デフォルトの名無しさん
21/03/23 18:14:05.04 2hAdV+Tt.net
$ tty
/dev/pts/0
$ ps
PID TTY TIME CMD
94 pts/0 00:00:00 bash
232 pts/0 00:00:00 ps
$ sudo ls -l /proc/94/fd
total 0
lrwx------ 1 user user 0 Mar 23 17:56 0 -> /dev/pts/0
lrwx------ 1 user user 0 Mar 23 18:08 1 -> /dev/pts/0
lrwx------ 1 user user 0 Mar 23 18:08 2 -> /dev/pts/0
lrwx------ 1 user user 0 Mar 23 18:08 255 -> /dev/pts/0
109:デフォルトの名無しさん
21/03/23 20:33:12.59 laboXhIZ.net
あなるほー
紐付いてんのか
POSIXで決まってたりするんかな?
110:デフォルトの名無しさん
21/03/23 22:24:47.39 abnhlux1.net
POSIXで当然定義はされてる
紐付いてんのか(?)のことじゃないけどな
111:デフォルトの名無しさん
21/03/23 22:43:31.00 laboXhIZ.net
標準エラー出力から入力した場合の仕様はどこに書いてるの?
112:デフォルトの名無しさん
21/03/23 23:02:58.99 abnhlux1.net
そんな仕様じゃないよ
<&2 という表記だから、標準エラー出力から入力する と思うのはしょうがないけど、多分思い違いしてるぞ
0<&2 は、標準エラー出力のディスクリプタの複製を標準入力のディスクリプタにするだからな
(その時点での)標準エラー出力のディスクリプタがrwで開かれてる tty(/dev/pts/0) で、それの複製なんだから、以下省略
113:デフォルトの名無しさん
21/03/23 23:06:00.65 laboXhIZ.net
> (その時点での)標準エラー出力のディスクリプタがrwで開かれてる tty(/dev/pts/0) で、
これがPOSIXの仕様なの?
114:デフォルトの名無しさん
21/03/23 23:17:16.76 abnhlux1.net
0<&2 は、標準エラー出力のディスクリプタの複製を標準入力のディスクリプタにする
これ
そこは、疑問と思ってるようだが仕様での動作として何も疑問はないってこと
115:デフォルトの名無しさん
21/03/29 04:33:30.50 T/NVAJfs.net
シェルスクリプトの互換性やら#!の書き方の作法互換性やらbashismやら言われてるけど、みんなmailcap/mime-type使わんの?
116:デフォルトの名無しさん
21/03/29 04:41:36.50 T/NVAJfs.net
一応mailcapそれ自体はPOSIX…のはず
ちゃんと各shのmime-typeがそのPOSIXで定義されてるかは不明だけど、IANAとかでは規定あるわけだし
みんな適切に拡張子つければ解決するんじゃないかなって
unix系以外のOSでも対応してるのでPOSIXのみ準拠よりポータブルのはず
117:デフォルトの名無しさん
21/03/29 07:07:57.33 wK+S1L2g.net
>>115
なにを言ってるのかわからん。
シェルスクリプトには全部.shという拡張子をつけろとでもいってんの?
/bin/shの実体がdashかbashかわからんって話踏まえてる?
118:デフォルトの名無しさん
21/03/29 07:31:02.84 HXftsQaM.net
>>116
だからこそ
application/x-dash; /bin/dash %s
mime-extensions
application/x-bash; /usr/bin/bash %s
mime-extensions
application/x-dash sh dash
application/x-bash bash
なり指定しておけば面倒はないと思ったんだよ(ごめん書式はあってるかしらん)
119:デフォルトの名無しさん
21/03/29 07:32:42.67 wK+S1L2g.net
>>117
だから /bin/sh になにを設定するのか教えて
120:デフォルトの名無しさん
21/03/29 07:34:02.79 HXftsQaM.net
ああ、/binとかに標準で入ってるのは大体.sh付いてないお行儀悪いのばっかだから不味いか…
今時配布するスクリプトには大体付けると思うけど、こればっかは仕方ない
121:デフォルトの名無しさん
21/03/29 07:34:21.19 wK+S1L2g.net
もう一つ。
gunzip という"シェルスクリプト" に
どういう設定をすれば良いのか教えて
$ file /bin/gunzip
/bin/gunzip: POSIX shell script, ASCII text executable
122:デフォルトの名無しさん
21/03/29 07:34:58.94 wK+S1L2g.net
>>119
実行ファイルには拡張子をつけないのが
"正しい" 作法ですが?
123:デフォルトの名無しさん
21/03/29 07:35:28.60 HXftsQaM.net
>>118 できるだけ互換なのを関連付けるのがベストプラクティスじゃないかな
125:デフォルトの名無しさん
21/03/29 07:36:04.54 wK+S1L2g.net
>>122
だから誰がつけるのよ?
シェルスクリプト配布時に作者が
どうやってつけるの?
126:デフォルトの名無しさん
21/03/29 07:36:41.97 HXftsQaM.net
>>121
どう考えても良くない習慣だと思うよ…
127:デフォルトの名無しさん
21/03/29 07:39:18.53 HXftsQaM.net
>>123
それはユーザー側でやるべきことだと思うけど、
sudo 要求できるならecho ... >>って手もあるかも
128:デフォルトの名無しさん
21/03/29 07:42:17.96 wK+S1L2g.net
>>124
良くない習慣だと言ってる人はだれもいません。
実際にディストリに含まれる実行プログラムで
実装言語の拡張子をつけてるプログラムは一つもありません
Ruby、Perl、Python、拡張子がついてますか?
そもそもさぁ、作者が 拡張子 .sh つけたとしても
じゃあ、これを何で動かせば良いのさ?
/bin/sh が bash だって言ってんだろ
129:デフォルトの名無しさん
21/03/29 07:50:37.48 T/NVAJfs.net
>>126
ちゃんとユーザーがどのインタプリタ(*sh、.py etc)で実行するべきか分かるように拡張子を付けるようにしましょう、って提言してる
そりゃインタプリタはインタプリタ名が自身を現してるから付ける必要は無いけど、解釈されるスクリプトには付けない理由は無いでしょう
パス決め打ちに依存するシバンより確実にインタプリタを指定できるわけだし
130:デフォルトの名無しさん
21/03/29 07:56:33.90 wK+S1L2g.net
>>127
> ちゃんとユーザーがどのインタプリタ(*sh、.py etc)で実行するべきか分かるように拡張子を付けるようにしましょう、って提言してる
少しは想像力ないのか?
作者が、.sh という拡張子を使って配布して
それをユーザーが、.bash に変更するようにしましょう
とお前が言っていて
そうするとファイル名変わるから、その .sh が
呼び出せなくなるだろ
ぐらいのこと思いつかんのか?
131:デフォルトの名無しさん
21/03/29 07:57:55.93 wK+S1L2g.net
訂正
そうするとファイル名変わるから、その .sh を
内部で呼び出すスクリプトが動かなくなるだろ
132:デフォルトの名無しさん
21/03/29 07:58:26.46 wK+S1L2g.net
だいたい「拡張子をつけないのが常識」だから
シバンというものがあるんだがな
133:デフォルトの名無しさん
21/03/29 07:59:44.04 qWZz7CCC.net
焦りすぎだ落ち着けw
134:デフォルトの名無しさん
21/03/29 08:04:34.67 wK+S1L2g.net
落ち着いてるw
そもそも拡張子ではどのインタプリタで動かすのかわからないという前提があるのに
今更何を言ってんだこいつって話
135:デフォルトの名無しさん
21/03/29 08:04:56.34 T/NVAJfs.net
>>128
拡張子は配布者が指定するんだよ、誤解を招いたみたいですまん
ここまでシバかれるとは思わんかった…
実行ファイルに拡張子付けるのが気に入らんなら、ファイル先頭付近のコメントにmime-typeを書いておけば検知されるわけだし、これなら既存の慣習と衝突しない落とし所としてどうだろ?
136:デフォルトの名無しさん
21/03/29 08:12:16.40 T/NVAJfs.net
>>132
zshくらい所謂shと違うと、.zshと付いてること多いけど、bashくらいの分かりにくい拡張だとshと付けたくなるのは分かるなあ
137:デフォルトの名無しさん
21/03/29 08:12:32.79 wK+S1L2g.net
>>133
> 実行ファイルに拡張子付けるのが気に入らんなら
気に入る気に入らないじゃなくて、拡張子をつけてはならない。
それともお前はwhichコマンドを、which.shに変更しろって言う気か?
138:デフォルトの名無しさん
21/03/29 08:17:34.76 T/NVAJfs.net
>>135
規格で決まってるコマンドはそりゃ付けちゃだめだよ
それ以外は気にいるか気に入らないかの問題でしょう
気にならないなら拡張子を付ける、気に入らないならmailcapが見つけられるようコメントにmimeを書く
139:デフォルトの名無しさん
21/03/29 08:19:14.60 wK+S1L2g.net
> それ以外は気にいるか気に入らないかの問題でしょう
違う。互換性の問題
実装言語を変えても、互換性は保たれなければならない
140:デフォルトの名無しさん
21/03/29 08:22:32.70 T/NVAJfs.net
>>137
なるほど、やっぱ拡張子はダメですね…アホなこと言ってました
コメント自動検知の方は何か見落としないですかね?
141:デフォルトの名無しさん
21/03/29 08:26:40.81 wK+S1L2g.net
OSの仕様として二行目にシバン2を作れって話?w
142:デフォルトの名無しさん
21/03/29 08:35:53.68 wK+S1L2g.net
結局はシバンを/usr/bin/env bashとかにすれば同じこと
143:デフォルトの名無しさん
21/03/29 08:40:37.26 T/NVAJfs.net
>>139
まさにその為にPOSIXへ導入された機構なのではないでしょうか?
mailと付いているのはメール方面で発展したからかな?と気になりますが
先頭付近に書いておけばrun-mailcapが検知してくれますよね、vimのモードラインみたいに先頭5行のような明確な判定法ってないんですかね?
ブラウザなんかはヒューリスティックで上手く決めてくれますけど、
144:デフォルトの名無しさん
21/03/29 08:50:40.11 T/NVAJfs.net
>>140
シバンが先頭占めてるので、GUIで適当にポチポチする人や、中身知らんけど取り敢えず./scriptで実行しちゃう人にはスルーされちゃうんですよね…
イマイチ強制力がないというか
win、linun、unix、macどこでも同じコマンド/クリックで同じように実行できるのは便利なんですが
145:デフォルトの名無しさん
21/03/29 08:58:49.98 wK+S1L2g.net
マジ意味不明
どんな手段でもいいからファイルの上の方に書いてある
なにかに従って実行ファイルを
146:動かすツールをもってこい 話はそれからだろ
147:デフォルトの名無しさん
21/03/29 09:14:27.76 T/NVAJfs.net
>>143
いや、だからそれがrun-mailcapでは…
ところで、debianのman読むと、最終的にfileコマンドにフォールバックしてmime-typeを決定するとか非常に不吉な事書いてますね!?
うちのfileはシバンから推測(bashとshの区別など)してたと思うので、一旦mailcapを参照する事によるパス非依存性以外に利点がない気がしてきました…
決定アルゴリズムが統一されてないのが課題ですかね
winはもちろん違うでしょうし、unix系でもメーラ/ブラウザは固有の方法で決めてますし
第4のシバンを待つしかないのか!
148:デフォルトの名無しさん
21/03/29 09:16:56.36 wK+S1L2g.net
>>144
なら、run-mailcapでいいじゃん。
あとは何をしてほしいんだ?
run-mailcapが要求する何かをすれば終わりだろ
149:デフォルトの名無しさん
21/03/29 09:18:26.85 SSJ6OpUN.net
うだうだと意味不明だな
シバンは(低レベル)OS API(exec系)でサポートされてるんじゃなかったかな
mime-typeを仮にサポートしてるOSがあってもせいぜい高級APIでじゃないの
何を言いたいのかさっぱりわからん
150:デフォルトの名無しさん
21/03/29 09:30:51.89 T/NVAJfs.net
>>146
スレを眺めるに高級環境っぽいので、posixの話はアリかと思いまして
ただ、shを名乗っててもbusyboxとか組み込みだと無さそうな気がしますね(調べてない)
普段コマンドラインに住んでますがすごく便利ですよmailcap
ただ、色々突っ込んで貰ってenvも良さそうな気がしてきました
151:デフォルトの名無しさん
21/03/29 09:33:26.88 wK+S1L2g.net
>>147
だから、mailcapがやってくれるんだろ?
シェルスクリプトの作者がやることはなにもないじゃん
152:デフォルトの名無しさん
21/03/29 09:36:04.57 SSJ6OpUN.net
OSレベルでもなくツールで便利だったからかよ?
自分が便利でしかないことをうだうだうだうだとかよw
153:デフォルトの名無しさん
21/03/29 09:36:15.38 T/NVAJfs.net
>>148
シェルスクリプト書く人の話ですよ
実行環境を指定するのに、シバンでパス直打ちか、envか、mailcapか、ということです
154:デフォルトの名無しさん
21/03/29 09:38:32.42 wK+S1L2g.net
>>150
だからmailcapとかいう実行環境を指定するために
何をすれば良いのか聞いてるんだが
155:デフォルトの名無しさん
21/03/29 09:43:42.09 SSJ6OpUN.net
mailcapではないがmime-typeをサポートしてるOSがあるんだが。ある意味OSレベルでサポートしてる
作法が多分違うと思うが、それはそれでmime-typeにある意味固執して使うのかなあ?
めんどくささの方が上回りそうだけどw
156:デフォルトの名無しさん
21/03/29 09:44:13.43 T/NVAJfs.net
>>151
普及運動ですかね…
157:デフォルトの名無しさん
21/03/29 09:49:41.80 SSJ6OpUN.net
既存の色々を知らなさすぎるのに普及運動とかは無理だろうとしか思えない
OSレベルでサポートしてるOSのでもそんなことやってるヤツ見たことないしな
158:デフォルトの名無しさん
21/03/29 09:52:18.11 T/NVAJfs.net
>>154
はい、当たり前と思ってたら色々目からウロコで
また勉強して建設的な議論ができるようになったら戻ってきます、皆ありがとう
159:デフォルトの名無しさん
21/03/29 09:59:52.36 Hi4CyJOB.net
>>137
あるいは、実装の詳細をファイル名に漏出させないため、やな。
ユーザーには関係ないし、開発者のフリーハンドを大きく残しとけるしな。
160:デフォルトの名無しさん
21/03/29 10:01:28.74 wK+S1L2g.net
>>153
普及運動したってmailcapに機能が搭載されてなければ出来ないだろ
だから早くいえmailcapを使うとして
シェルスクリプト作者は何をスレば良いんだ?
実は何もしなくて良いんだろ?w
そもそもmailcap使っても出来ないことだからwww
161:デフォルトの名無しさん
21/03/29 10:02:18.72 /i/qkskJ.net
webだとみんなmimeでインタプリタ決めるしな
その方面で育つとカルチャーショック
162:デフォルトの名無しさん
21/03/29 10:03:55.77 SSJ6OpUN.net
>>158
そういう流れかあ。そ
163:れっぽいな
164:デフォルトの名無しさん
21/03/29 10:05:03.53 wK+S1L2g.net
× webだとみんなmimeでインタプリタ決めるしな
○ ウェブサーバーだとみんなmimeでインタプリタ決めるしな
ウェブサーバー側の設定でやるから
スクリプトの作者は何もする必要がない
ウェブサーバー側に相当する何かを用意すればいい
165:デフォルトの名無しさん
21/03/29 10:09:45.64 SSJ6OpUN.net
読めてないんじゃないの。そんな具体的な話でないぞ
166:デフォルトの名無しさん
21/03/29 10:12:06.19 wK+S1L2g.net
そういう話だよ
167:デフォルトの名無しさん
21/03/29 10:13:08.06 SSJ6OpUN.net
まあ、ご自由に。話が繋がるとは思えないけど
さて
168:デフォルトの名無しさん
21/03/29 10:21:39.61 mn0uwvfX.net
自分で設定するのは面倒、色んな環境の初期設定が揃ってよろしくなってからかな
169:デフォルトの名無しさん
21/03/29 15:38:51.51 Hi4CyJOB.net
潔癖症とか完璧主義者とかがUNIX系のもろもろをキモく感じるのはわかる。
とくに最初のころ。
馴れてくると、だいたい気にならんくなってくる。
それがいいことかどうかはわからんけど。w
170:デフォルトの名無しさん
21/03/29 15:48:26.38 jeDqT5qX.net
>>126
うちのはデフォルトで/bin/shがzshになってるよ
171:デフォルトの名無しさん
21/03/29 17:08:18.30 wK+S1L2g.net
>>166
デフォルトで/bin/shがzshのシステムが有るなら教えて
聞いたこと無いぞ
172:デフォルトの名無しさん
21/03/29 17:44:52.06 jeDqT5qX.net
>>167
macOS Catalina
以前は手を入れないとダメだったらしいけど
現バージョンは最初からzshになってる
173:デフォルトの名無しさん
21/03/29 17:47:55.60 T/NVAJfs.net
めっちゃ右翼だなそりゃ…
仕方なく読む專だからわからんのだけど、zshもshっぽく振る舞うモードとかあるんじゃないのさすがに限度ってものがあると思うが
174:デフォルトの名無しさん
21/03/29 17:51:37.76 jeDqT5qX.net
>>169
単にGPL汚染だったからと言われてるけどApple側から説明はないので不明
bashのv4からGPL3になったのが理由だと思う
175:デフォルトの名無しさん
21/03/29 17:53:39.75 wK+S1L2g.net
>>168
> macOS Catalina
どーせそういうと思ったw
なんつーか、みんな基礎的な知識がないよな
あ、macOS Catalinaの/bin/shは(POSIXモードの)bash 3.2.57 だ
これからもずっと変わらんだろうよ
176:デフォルトの名無しさん
21/03/29 17:56:44.94 jeDqT5qX.net
>>171
現バージョンはzshになってるよ
確かめてみ
177:デフォルトの名無しさん
21/03/29 17:58:03.88 jeDqT5qX.net
なおBigSurは最初からzsh
もうbashには戻らんだろうね
178:デフォルトの名無しさん
21/03/29 18:01:27.34 wK+S1L2g.net
>>172
お前が確かめろや
/bin/shって入力して、プロンプトになんと表示されるか言ってみろ
179:デフォルトの名無しさん
21/03/29 18:04:28.54 1/gzKsrI.net
ログインシェル と /bin/sh は違うぞ
/bin/sh がなんなの確認してみ
180:デフォルトの名無しさん
21/03/29 18:06:21.42 jeDqT5qX.net
>>174
とっくに確かめてるって
BigSurはまだ更新してないから聞いただけだが最初からzsh
わからん人だね
そんに疑うなら自分でやってみ
181:デフォルトの名無しさん
21/03/29 18:07:44.45 jeDqT5qX.net
>>175
zshにリンクされてるね
182:デフォルトの名無しさん
21/03/29 18:07:48.03 wK+S1L2g.net
>>176
俺が聞いたのは、プロンプトになんて表示されるかだ
なぜ質問に答えられないのか?
それだけなんだが?
レスするよりタイプ文字は少ないだろ
ああ面倒だw
答えは、sh-3.2
bash 3.2の3.2だ
なにか言い返す言葉はあるか?
183:デフォルトの名無しさん
21/03/29 18:08:14.41 1/gzKsrI.net
>>176
確かめてないだろw
冷静にもう一度ちゃんと確かめてみ
>macOS Catalina
>以前は手を入れないとダメだったらしいけど
ってのからも明らかにログインシェル=/bin/shだと思ってるだろうし
184:デフォルトの名無しさん
21/03/29 18:10:30.37 wK+S1L2g.net
>>177
されてない
それどころかbashにもリンクされてなくて
ファイルサイズはbashとzsh(ほぼ同じぐらい)の1/10程度しかない
これは/bin/shがbashをベースにPOSIXに準拠するだけの機能に
減らしてビルドした縮小版だからだ
185:デフォルトの名無しさん
21/03/29 18:13:42.46 1/gzKsrI.net
>>177
嘘なのかw、マジでそうならなんかおま環くさい
/bin/shがコロコロ変わったら困るから(コロコロ変わる必要�
186:烽ネいしな)、なんらか(chsh)でそうなるわけもなく、なんでそうなんか...嘘くさいww BigSurはまだ更新してないからってことは、Catalinaか...尚更嘘くさい そんな変なの捨ててクリーンインストールしなさいなww
187:デフォルトの名無しさん
21/03/29 18:14:08.54 wK+S1L2g.net
しかしmacOSの/bin/shが、bashやzshの1/10にまでサイズが減ってるとなると
本来のbashに比べて/bin/shは相当機能が削減されたbashだと思うけど何が減ったんだろう?
/bin/shはbashのインタラクティブシェルとしての機能を削っただけかな?
188:デフォルトの名無しさん
21/03/29 18:16:02.09 qWZz7CCC.net
チャーリー浜「...」
189:デフォルトの名無しさん
21/03/29 18:16:35.62 wK+S1L2g.net
そういやqiitaかなんかでmacOSの/bin/shを最新のbashに
アップデートしましょうとか書いてあった記事があったな
Apple版bashじゃなくてbash本家からビルドしてsudoでcpしてw
システム壊す気かって思ったwww
190:デフォルトの名無しさん
21/03/29 18:25:27.61 1/gzKsrI.net
>>183
そこまで書いたなら書いてよw
一瞥でなんのこっちゃと思った。それが狙いかも知れんが
191:デフォルトの名無しさん
21/03/29 18:30:46.99 wK+S1L2g.net
ふ、黙った所を見ると終わったかね?素人が俺様に敵うわけねーだろ
192:デフォルトの名無しさん
21/03/29 18:33:56.47 1/gzKsrI.net
お前はそれを冗談で言ってなさそうなとこがな
193:デフォルトの名無しさん
21/03/29 18:34:14.26 5I9+wJCt.net
動いてるなら必要十分だよな
bashはもうバージョン5だし、補完やらのAPIを外部に晒したのが成功して、対話モードが随分良くなった
2つ入れるのはアリだと思う
名前も念の為分けといた方がいいかもしれない(俺はサボったけど)
ただ、呪文のようなパラメータ置換をモリモリ実装してるのは頭おかしいと思う
外部コマンド使え
194:デフォルトの名無しさん
21/03/29 18:35:37.53 wK+S1L2g.net
> ただ、呪文のようなパラメータ置換をモリモリ実装してるのは頭おかしいと思う
> 外部コマンド使え
1/1000ぐらいにパフォーマンス下がるぞw
数値は適当だが
195:デフォルトの名無しさん
21/03/29 18:38:16.17 wK+S1L2g.net
外部コマンドはパフォーマンスが大幅に低下するだけじゃなく
改行をうまくあつかないという問題がある
変数には改行を入れられるが、外部コマンドだと行区切りとして扱われる
196:デフォルトの名無しさん
21/03/29 18:46:02.19 CpwX2Qd/.net
そういえばCatalinaだとこれ↓見ろってでますね
URLリンク(support.apple.com)
197:デフォルトの名無しさん
21/03/29 18:59:51.55 wK+S1L2g.net
>>191
> macOS Catalina の Bourne 互換シェルとのスクリプトの互換性をテストするには、
> 「/var/select/sh」を「/bin/bash」「/bin/dash」または「/bin/zsh」に変更してみます。
それみてmacOSの/bin/shのサイズが1/10しかない理由がわかったw
man shすれば書いてあったが、macOSの/bin/shはシェル本体じゃなくて
シェル(/var/select/sh、デフォルトは/bin/bashへのシンボリックリンク)
を起動するためのコマンドなのか
どおりでstrings使ったらbashやzshといった文字が見つかるわけだ
/bin/sh をデフォルトのbashから別のシェルに変更したい場合は
シンボリックリンクを変更すれば出来るんだな
ってことはやっぱり単にPOSIXモードが有効になったというだけのbashなのかもな
198:デフォルトの名無しさん
21/03/29 19:55:41.76 1/gzKsrI.net
>>191
/bin/dash ってあるから、
次か次の次かで /bin/sh は bash を捨てて(流石に捨てるだろう3ベースのなんて。kshがまだあるから同じように残るか??) の dash になる可能性が大な感じ?
199:デフォルトの名無しさん
21/03/29 20:03:13.24 wK+S1L2g.net
>>193
bashからdashに変更すると互換性が壊れるからなぁ
まあそれをUbuntuがやってのけたから
互換性気にしないAppleならやるかもな
保守が続いてるdashに変更するか
それともAppleがbashをメンテンスし続けるか
後者でもほぼ修正はないんだから、大変ではないだろうな
200:デフォルトの名無しさん
21/03/29 20:07:19.27 KEZ/XNTe.net
>>189
そこまで気にしてなかった、利点はあるのね
しかしパースの曖昧さissueがどんどん上がってたり、使わない部分にまで影響が及ばないか不安になってくる
201:デフォルトの名無しさん
21/03/29 20:10:44.21 1/gzKsrI.net
Appleでメンテするのがめんどくさくなって捨てるのは定番
移行を即すためにも最後のあるんだろうし、dashをも入れてるのは 意味がある ことだろう
Appleの準備が終わったら&Appleが移行期間が終わりと見なしたら変わるだろうな
bashに固執することなんてないし
202:デフォルトの名無しさん
21/03/29 21:01:40.15 wK+S1L2g.net
bashは機能拡張とかいうレベルのメンテはしなくていいけど
もしかしたらこれから新たな脆弱性が見つかる可能性もあるからね
そうなると古いbashは公式にはメンテされない
Appleが独自で修正を入れる必要がある
/bin/sh(=/bin/bash)はAppleが手を入れてるからGPLv3だと困るとして
まったく手を入れなくていいとなった場合
macOSに新しいbashをバンドルすることはあるだろうか?
つまり古いbashはいずれにしても問題があるわけで更新しなければいけない
だから/bin/shをdashに変更した後、bash5をバンドルするかなってこと?
それが無理ならdashに変更したらbashを削除することも有り得そう
それを見越してzshに移行しろって言ってるのかもな
203:デフォルトの名無しさん
21/03/29 21:01:56.86 wK+S1L2g.net
つまりbash用スクリプトはmacOSで動かないわけで、
bashを入れるためにはHomebrewを使わなければならないわけで
そうするとbashからdash(POSIX準拠)に書き直す必要があるんじゃないか?w
HomebrewのインストーラーをRubyからBashに書き直しました!
URLリンク(itchyny.hatena)
blog.com/entry/2020/03/03/100000
これどれくらいbash依存してるんだろう?
204:デフォルトの名無しさん
21/03/29 21:13:02.60 wK+S1L2g.net
Homebrewのインストーラー
URLリンク(raw.githubusercontent.com)
ざっと見てみたが、結構長いな
配列使ってるところがread -n 1が少し厄介だな
POSIX準拠させるよりもzshで動くようにしたほうがいいのかもしれんな
しかしこれどうやってテストしたんだろうか
205:デフォルトの名無しさん
21/03/29 21:49:47.52 wK+S1L2g.net
ふむ read -n 1 = getchのPOSIX準拠コードはあるようだ
URLリンク(qiita.com)
getch() {
old=$(stty -g)
stty raw -echo min 0 time 1
printf '%s' $(dd bs=1 count=1 2>/dev/null)
stty $old
}
じゃああとは配列の置き換えが面倒なだけだな
206:デフォルトの名無しさん
21/03/30 22:27:21.29 jfNjkEti.net
こうなったら世界唯一のリードオンリー言語、applescriptで書き直すしかないな
207:デフォルトの名無しさん
21/03/31 11:33:02.43 AtIsL56M.net
arrayも使えないのは正直つらい
コマンドだけど魔改造でびっくらこいたのはlinux版のcolumn.1(kernel.org配布なんで公式のはず)だなあ
linuxなのに-hも--helpも受け付けないbsd版使ってたわ
--jsonとか--treeとかもはやcolumnの域を超越してる
208:デフォルトの名無しさん
21/03/31 12:20:25.54 ekNiD538.net
配列なんていらんと思ってるけど、何に使ってるか聞いていい?
できれば難しいケースでw
209:デフォルトの名無しさん
21/03/31 12:34:19.85 AtIsL56M.net
ごめん、単語分割めんどいので全部突っ込みます
210:デフォルトの名無しさん
21/03/31 12:37:32.99 ekNiD538.net
>>204
URLリンク(github.com)
こうやりたいのなら
options="-j 5 -B"
make $options file
こうやればいい
make_with_flags() { make -j 5 -B "$@"; }
make_with_flags file
配列はやっぱり、いらんのよなぁ
211:デフォルトの名無しさん
21/03/31 12:43:15.98 ekNiD538.net
単語分割は値にスペースが入ってるときに困るんで基本使わないよ。
その上で配列いらんと思ってる。>>205に書いた通り
212:デフォルトの名無しさん
21/03/31 16:10:08.25 AtIsL56M.net
>>205
ああwikiにもデバッグにもお世話になってるわshellcheck様々
まあそうなんだけど、逆に割りたいところでは割りたい時にも文字列より便利なんだよなコマンド組み立てとか
そもそも俺のは乱用であって、配列本来の用途は添字で引くことでしたね!
mktempしてpaste key valueを流し込み、
grep ^key^I |cut -f2-
で引くとかぱっと思いつくけど、汚え
なんか良い方法あったらご教授頂きたい
213:デフォルトの名無しさん
21/03/31 16:20:02.26 AtIsL56M.net
まずmktempじゃなくて文字列変数でいいな、最大サイズとか規格にありそうだけどとりあえず
214:デフォルトの名無しさん
21/03/31 16:54:44.20 0ggCFJWv.net
配列は普通キーと値を追加して育てるので'key sep val '>>で追記
二度同じキーを入れると複数引っかかるので
tac |grep -m1あるいはtail -n1
とりあえずkey sep>>で空文字が返るでよしとする
でもunsetと区別できない
セパレータはタブよりヌル文字にあたりにしたほうが無難そう
ボロボロ出てくるんで出直してきます…
215:デフォルトの名無しさん
21/03/31 20:23:49.38 rlnsgVLR.net
>>207-209
ちゃんと読んでないけど
コマンド組み立てならこんな感じ
[ "$FLAG" = "on" ] && set -- -f "$@"
[ -e "$FILE" ] && set -- --file "$FILE" "$@"
cmd "$@"
添字で引きたいならこんな感じ
set -- a b c
echo $2
grep ^key^I |cut -f2- なら、次のようにすればgrepもcutも使わなくても出来るよ
while IFS="$TAB" read -r key value; do
echo "$value"
done
一般的なプログラムでは配列あったほうがいいけど
シェルスクリプトでやるような内容で配列なんかいらない
ただみんなシェルスクリプトを雰囲気でやってて知らないだけ
216:デフォルトの名無しさん
21/03/31 20:37:35.81 fnN7hvaV.net
でも、PerlもPythonもないけど、いれるほどでもない用事のときには、Bashくらいが適当かつ充分だったりするからね。
217:デフォルトの名無しさん
21/03/31 20:43:11.59 rlnsgVLR.net
へー、fi って終了って意味だったのか。勉強になった
URLリンク(www.dict.com)
fi, -na [fi]
終了, 終止, 終わり, おしまい, 最後, 結末, 終結
218:デフォルトの名無しさん
21/03/31 20:44:51.45 rlnsgVLR.net
>>211
そのBashくらいが~が俺にとっては、Dash(POSIX準拠)で十分なんだよね
219:デフォルトの名無しさん
21/03/31 21:13:09.30 4SvaIgPh.net
まじかよ、じゃあesacもすげー意味に違いないな
220:デフォルトの名無しさん
21/03/31 21:16:15.45 1zeQu1PP.net
URLリンク(acronyms.thefreedictionary.com)
221:デフォルトの名無しさん
21/03/31 22:31:27.28 rlnsgVLR.net
実際fiって映画の最後のfinから来てるのかもな
222:デフォルトの名無しさん
21/04/01 03:14:03.54 B5PjUTjB.net
ここが教養スレだ!
223:デフォルトの名無しさん
21/04/01 14:47:29.53 9tfGPqCh.net
シェルスクリプトじゃないけど、質問。
makeで、ターゲット実行が成功しても失敗しても、最後に後始末みたいな処理をさせる方法はない?
bashな�
224:輻rap ... EXITでできるけど。
225:デフォルトの名無しさん
21/04/01 15:17:09.43 Hb/UV5K1.net
URLリンク(stackoverflow.com)
やることは同じだな
226:デフォルトの名無しさん
21/04/01 21:35:25.25 HbnIL0Hw.net
>>219
ああ、pipefailの意味をやっと理解したわ
bashのinfo何度も通読してるはずなんだけど、last commandのステータスを返すって当たり前じゃね、ってスルーしてた…
限りなくバグに近い仕様ってやつか
227:デフォルトの名無しさん
21/04/01 22:02:03.77 B5PjUTjB.net
互換性オプションはマニュアル読んでも例を見ないと分からない物が多いと思う
228:デフォルトの名無しさん
21/04/01 22:26:08.86 o5XCnMGW.net
makeの欠点はシェルの文法を混ぜ込むことだよな
229:デフォルトの名無しさん
21/04/01 23:47:14.73 I05CY+G0.net
>>219
ちゃうねん、もう一声!
ひとつのターゲットの中での最後じゃなく、依存関係にあるターゲットでも、並列のターゲットでも、とにかくすべての最後に処理をやらせたいんや。
ちなみに、そのページは見てたけど、流してたわ。w
あらためて見直すと、意義がわかった。
ありがとやで!
230:デフォルトの名無しさん
21/04/01 23:49:43.54 I05CY+G0.net
>>222
「$」がとくにな。。。
make変数とシェル変数と正規表現行末とエスケープで混乱しがち。orz
231:デフォルトの名無しさん
21/04/02 00:09:16.86 sr96G99p.net
>>223
```sh:build.sh
trap 'echo end' EXIT
make
```
./build.sh
232:デフォルトの名無しさん
21/04/02 02:22:57.94 xkKIrGbu.net
>>225
ちなみに、>>219のリンク先にも、.ONESHELLからのtrap+makeがあるんや。
たしかに、make関数とかで引数をこねまわしたら、なんとか思ったことができはするんやろうけど、しかしそれもなあ。。。
ということで、makeはそろそろあきらめる方向。
Pythonスクリプトを検討中。
さっぱりきれいな方法があったら頼むわ!
233:デフォルトの名無しさん
21/04/02 02:28:01.75 sr96G99p.net
Pythonスクリプトの問題点
1. makeのように依存ファイルに基づいた処理を行うのが大変
2. makeでやっていたような処理はシェルスクリプトで書いたほうが簡潔に書ける
なんでPythonのようなタスクを行うのに
適してない言語を使おうとするのかわからない
234:デフォルトの名無しさん
21/04/02 11:31:17.73 ebi/L5xP.net
make相当のもあるし最近良くなったので(PEP517)、python+c拡張のプロジェクトでなら従った方がいい
わざわざビルドプロセスだけpythonで書いて添えるんならやめとけ
235:デフォルトの名無しさん
21/04/02 13:02:49.67 xkKIrGbu.net
>>227,>>228
どっちでもないから心配すんな。w
makeはビルド以外でも使えるんやで!
236:デフォルトの名無しさん
21/04/02 13:20:46.71 sr96G99p.net
>>229
そんなsedはゲームにも使えるんやで!みたいなことを言われてもな
sedで書かれたチェスがもの凄い件
URLリンク(softantenna.com)
> sedで書かれたテトリス「sedtris」なんてものまであるようです。
自分が得意な言語じゃなくて適切な道具を使いましょうってだけ
make使ってなにかのコマンドを実行してたんだろ?
ならそれはシェルスクリプトが適切な道具だ
Pythonじゃない。Pythonで書くと倍以上にコードが長くなるだろう
237:デフォルトの名無しさん
21/04/02 13:27:11.24 s72UfXRI.net
それもよく言われるけど落とし穴が多すぎる、現にハマってるようだし他の方法を考えた方が
238:デフォルトの名無しさん
21/04/02 13:27:52.24 s72UfXRI.net
>>229宛てね
239:デフォルトの名無しさん
21/04/02 13:36:01.88 ebi/L5xP.net
なるべく基本ユティリティでやりたくて、makeで融通が効かないタスクの自動順序解決&実行ならtsortを使うのが良い
240:デフォルトの名無しさん
21/04/02 13:46:20.17 ebi/L5xP.net
何がやりたいのか小出しでよくわからんね
makeはtsort+ビルド向けの機能のセットであって、ビルドに使わないなら必要としてるのはtsortの部分だろ
241:デフォルトの名無しさん
21/04/02 14:06:24.57 qkslRrVn.net
具体的にどうタイムスタンプ(に限らないが)を取ってきてコマンドと結合しtsortにかけ、出力を整形して実行するのか
みたいな事なら答えてやれるし、それがこのスレの趣旨だろう
242:デフォルトの名無しさん
21/04/02 14:16:05.96 W1Cqjj5x.net
単にタスクランナーとして使ってるだけかもしれんし、質問者が出してない情報を推測であれこれ言うのはやめよう
243:デフォルトの名無しさん
21/04/02 17:21:25.62 l3SG9gZX.net
#!/bin/sh
# >>14
# 外国籍の者が日本人に成り済ますために使う「通名」作成スクリプトを実行し
# 当たり玉を3回以上出した者をPOSIX中心主義者と見なしコレ以降の書き込みを禁じる
KIM=1
while [ $KIM -lt 21 ]
do
echo "$KIM回目"
KIM=$( expr $KIM + 1 )
NAME=$( shuf -e 村 崎 本 田 山 玉 子 -n 1 )
if [ "$NAME" = "玉" ]
then tput setaf 3 && echo "金$NAME"; tput sgr0
else echo "金$NAME"
fi
sleep $(( $(od -vAn -N3 -i /dev/random) % 5 ))
done
244:デフォルトの名無しさん
21/04/02 17:37:09.20 sr96G99p.net
POSIX中心主義ってあれ生きてるの?
もう虫の息なきがw
245:デフォルトの名無しさん
21/04/02 18:12:13.70 Ka7wreYU.net
煽ってくる質問者なんてほっとけ
246:デフォルトの名無しさん
21/04/02 18:17:16.53 hbCxlU+U.net
移植性や持続性っても、
移植性ってただ他でも動くでしかないし、
持続性ってただ変わらない=古いのに固執でしかないし
メンテナンス性は軽視もしくは考慮外だからな(命名のいい加減さから考慮してないだろうなw)
その面が実務者(新しい人だけど)に公にやんわりとw指摘されて瀕死かな
247:デフォルトの名無しさん
21/04/02 18:25:37.14 2zuzxBMS.net
>>240
日本語でOK
248:デフォルトの名無しさん
21/04/02 18:35:13.75 hbCxlU+U.net
自分の無知を人の日本語wのせいにするんじゃないよ
249:デフォルトの名無しさん
21/04/02 18:42:19.12 ebi/L5xP.net
tsortはmakeのような動的依存解決&コード生成に使う発想は無かったわ
確かにスクリプト中でタイムスタンプでソート(sort)してからtsortすればmakeの基本機能はカバーできるが、実行したいコマンドを直接書くのはセパレータの扱いや依存が一つしか書けないなど厄介
書き散らしたシェル関数/コマンド"名"を直列に依存解決してダンプ、リファクタリングの参考にするのには気軽でいい
250:デフォルトの名無しさん
21/04/02 19:16:18.60 1/Ara7QU.net
進捗率表示してくれるpvコマンドってどうなの?
やっぱその分処理遅くなったりする?
251:デフォルトの名無しさん
21/04/02 19:16:25.76 ebi/L5xP.net
見かけ上無引数のシェル関数で包めば、とりあえず簡単に動くコードは吐けるか
あんまりやりすぎるとmakeでタスクランナーと変わらんが
252:デフォルトの名無しさん
21/04/02 19:37:10.62 ebi/L5xP.net
>>244
timeするしかない
例え何も処理しないコマンドであっても、パイプに挟んだとたんバッファリングモードの不整合で遅くなることだ�
253:チてある
254:デフォルトの名無しさん
21/04/02 19:42:14.08 ebi/L5xP.net
たぶん求められている答えじゃないかもしれないけど…
ことパイプに関しては前後のコマンドすらスループットに大いに関係がある
特に挟まれる前提のコマンドなら、それ単体で遅い速いを言うのは意味がない
255:デフォルトの名無しさん
21/04/02 20:08:48.33 ITrGzi0M.net
進捗確認ツールならそれ自体は多分十分気をつけてるだろ、通信先が病的なら気をつけても無駄だが
遅くて困ってからstdbufとか試せば
どうしても必要なものとは思えないけど、インストールスクリプト等でこだわりがあるなら
256:デフォルトの名無しさん
21/04/02 20:45:04.78 B/D63v/Y.net
確かにこれに限らずパイプ通しただけでもわからんよな
それ用のコマンドだから意識してるとは思うが
257:デフォルトの名無しさん
21/04/02 22:49:58.28 Gl9s1y4K.net
straceするんだ
ファイルIO想定で書いたけど、ストリームも一応(ロジックそのままで)対応しとくかみたいな奴が腐ったミカン
内部バッファにある程度貯めて処理するのが理想だけど、パイプラインのパーツはそうじゃない
こまめに空パイプ覗きに行って藪蛇ブロック、貯めたデータの処理止まってたり
時々ドバっと書き出すから後続はずっとアイドル
なんかインピーダンスみたいだな
258:デフォルトの名無しさん
21/04/02 22:56:06.54 Gl9s1y4K.net
リーダ/メイン/ライタの3プロセスで1コマンド構成するのがベストになんだろうが、めんどくさいな…
pvみたいに統計取るだけの奴は、読んだ分をそのまま書き出すだろうから、それ自身が問題起こすことは考えにくいかと
ところで、誰かtime したかー?
259:デフォルトの名無しさん
21/04/02 23:12:36.74 nXGaO3xM.net
タスクランナーなら、
Jenkins,
Ruby のRake, Thor,
JavaScript のnpm scripts, gulp
260:デフォルトの名無しさん
21/04/02 23:21:07.01 Gl9s1y4K.net
俺は他の使ってるが、単なるオレオレタスクランナーならモダン言語で良いの山ほどあるしな
やっぱり何でもmakeマンには賛同できないわ
261:デフォルトの名無しさん
21/04/02 23:22:46.09 Gl9s1y4K.net
どうせ自分用なんだから好きなの使えば良いわけだし
262:デフォルトの名無しさん
21/04/02 23:55:49.61 Fe5X0u2X.net
複数の言語を使ってるとなんで言語ごとに
タスクランナーを変えなきゃいけないんだよと思う
大したことなんかしないだろ
263:デフォルトの名無しさん
21/04/03 00:05:04.26 hWVbhofL.net
>>255
高度な機能を実装する為にモダン言語使っているというだけで、自分の好きなシェルを指定して、そのシェル文法で書くのが主流だと思うよ
(思う、というのはホスト言語の構文ももちろん使えるから、他人は知らん)
.ONESHELLみたいな汚いワークアラウンドも要らないしmakeよりはbsh
264:デフォルトの名無しさん
21/04/03 00:12:46.44 YB/KO+42.net
Makefileは真のタスクランナー(シェルスクリプト)の
よく使う使い方を書いたサンプルファイルだよw
makeコマンドが入っていれば、makeコマンドで実行できるし
入ってないならMakefileの中を見て
そこに書いてるサンプルを直接実行するもの
265:デフォルトの名無しさん
21/04/03 00:23:20.08 r67/WY6G.net
makeがcで書かれてるからといってcでルールかかない
266:デフォルトの名無しさん
21/04/03 00:24:59.87 r67/WY6G.net
のと同じか
スレチぎみだけどbashで書けるオススメおしえろ
267:デフォルトの名無しさん
21/04/03 00:28:21.58 YB/KO+42.net
> bashで書けるオススメおしえろ
どういう意味?
makeは依存ファイルに基づいてビルドするターゲットを決めるものだけど
その機能を使わないで、ただのタスクランナーとして使うなら
普通にシェルスクリプトにコード書けばいいんじゃん?
よくinstall.shとかあるでしょ?
インストールというタスクを実行してる
268:デフォルトの名無しさん
21/04/03 00:37:33.71 r67/WY6G.net
>>260
ロジック頭から追わなくてもルールベースで書けるってのが意義では、ここだけmake信者の気持ちは理解できる
カジュアル用途なら再コンパイル判定は要らないし、トポロジカルソートだけしてくれれば大体みんな満足でしょう
シェルオタとしては上の方に出てるtsort実装もやってみたくはある
269:デフォルトの名無しさん
21/04/03 00:40:42.08 YB/KO+42.net
>>261
ルールって何?ルールがなにもないんだけど?
270:デフォルトの名無しさん
21/04/03 00:42:44.05 r67/WY6G.net
ごめん、多分タスクランナーという言葉の解釈違いだわ
初めて聞いた言葉なので、>>236の用例を借りました
適切な順序で実行する必要があるコマンドの実行(但し非ビルド用途
271:デフォルトの名無しさん
21/04/03 00:52:45.70 r67/WY6G.net
>>262
connect: lounch-serverみたいな感じ、これなら生tsortでも済むけど
272:デフォルトの名無しさん
21/04/03 00:53:12.25 YB/KO+42.net
>>263
適切な順番に並べればいいだけじゃん?
例えばmake.shとか作って
task1() { ・・・}
task2() { ・・・}
task3() { ・・・}
cmd1() {
task1
task2
task3
}
"$@"
とか書けば、make.sh cmd1でこの順番通りに実行できるでしょ?
task2がtask3に絶対依存するってものなら
task2の中からtask3を呼び出せばいいだけだし
シンプルな手続き型で書けることを
知らなきゃわからない独自の定義構文で書くのってアホらしいと思う
273:デフォルトの名無しさん
21/04/03 00:55:23.30 r67/WY6G.net
依存とレシピを同一視できるのが強みじゃないかな
274:デフォルトの名無しさん
21/04/03 00:56:16.66 YB/KO+42.net
なんのために?
275:デフォルトの名無しさん
21/04/03 00:57:18.69 r67/WY6G.net
簡潔性
276:デフォルトの名無しさん
21/04/03 00:58:12.59 YB/KO+42.net
>>265がより簡潔になるというのなら
それを見せてほしいが
277:デフォルトの名無しさん
21/04/03 01:06:37.77 r67/WY6G.net
>>269
適切な順番に並べたのなら書き直さなくていいよ、適切に並べる為の仕組みの話で
あと簡潔というのは各記述の話であってコード全体が簡潔になるという意味ではないぞ…むしろトポロジカルソート直列化後のコードは一般に冗長になる
278:デフォルトの名無しさん
21/04/03 01:14:42.13 r67/WY6G.net
つーかいい実装無いか尋ねてる俺になぜ聞く…
独特のレス見るに月末に初心者イビってた奴か?
279:デフォルトの名無しさん
21/04/03 01:14:50.26 YB/KO+42.net
適切に並べる為の仕組み?
どの順番で実行すべきかなんて人が知ってる
280:デフォルトの名無しさん
21/04/03 01:16:18.50 r67/WY6G.net
などとautotoolsもcmakeもわけわかんねー事をほざいでおります
281:デフォルトの名無しさん
21/04/03 01:18:13.59 r67/WY6G.net
タイポしちゃった、わけわかんねー、の前に、"も理解できないオッサン"を補って読んでください
282:デフォルトの名無しさん
21/04/03 01:20:35.91 YB/KO+42.net
>>273
autotoolsもcmakeも「発生した問題」を解決するためのツールであって
問題が発生してないのに、使うものではないと言ってます。
タスクランナーごときで問題が発生しますか?
まさにKeep it simple stupidの話だよ
シンプルにしておけ
283:デフォルトの名無しさん
21/04/03 01:34:22.75 r67/WY6G.net
>>275
やっぱ分かってねえじゃん
問題が起きないようアルゴリズムに任せるとこは任せましょう、というツールだよ…
そしてそのアプローチはカジュアルユースにも使えるよね?
284:デフォルトの名無しさん
21/04/03 01:37:02.86 YB/KO+42.net
> 問題が起きないようアルゴリズムに任せるとこは任せましょう
無理です。どちらにしろ人間が依存関係の情報を書かなければいけません。
単に書き方が変わってるだけです。
285:デフォルトの名無しさん
21/04/03 01:41:25.51 r67/WY6G.net
そういう意見はここじゃやくてそれらのツール、あと
>>252
Jenkins,
Ruby のRake, Thor,
JavaScript のnpm scripts, gulp
のメーリスにでも投稿してくれ
もしかしたら世の役に立たないこともないかもしれん
286:デフォルトの名無しさん
21/04/03 01:44:38.22 YB/KO+42.net
ここまでレスの応酬を続けておきながら、
今更そんなレスをするっていうのは
これ以上言い返せなくなったからということなんですね
287:デフォルトの名無しさん
21/04/03 01:44:39.70 r67/WY6G.net
昨日結構賑わいあって久々に良い感じの雰囲気だったのに、ID真っ赤にして空気乱してすまんかった
大人げない、反省
288:デフォルトの名無しさん
21/04/03 01:45:59.57 ANUlY9KL.net
>>279
ああもうそれでいいよ、君の勝ち
おめでとう
289:デフォルトの名無しさん
21/04/03 01:53:31.65 YB/KO+42.net
>>281
お前が、俺の勝ちに見えるのなら、そうなんだろうな
290:デフォルトの名無しさん
21/04/03 01:56:49.08 K2jZ2c+V.net
こいつが絡むといつもこう、目的が↑これが冗談じゃないからな
291:デフォルトの名無しさん
21/04/03 13:13:41.11 eS+08rtw.net
チャンピオンの誕生を祝して専スレを建てよう
敗者も向学のためご一緒にどうぞ
292:デフォルトの名無しさん
21/04/03 13:19:21.91 G0wsjcxM.net
それは良い考え。チャンピオンを称えてそうしてくれるとありがたい
293:デフォルトの名無しさん
21/04/03 15:48:41.71 cpKOTPf8.net
>>236
当たらずとも遠からず。
目的は、サーバーテスト。
で、テスト終了後にサーバーを始末したかったんや。。。
>>265
そんなんするくらいなら、makefileのほうが万倍マシやな!w
makeと違って、個別ターゲットの指定もできないし。
>>235
tsortを持ち出す教える君は、上から教えたい気持ちが漏れすぎやで!
URLリンク(togetter.com)
294:デフォルトの名無しさん
21/04/03 15:51:10.04 cpKOTPf8.net
↑
リンク先を間違った。orz
URLリンク(togetter.com)
電車が揺れすぎなんや!
295:デフォルトの名無しさん
21/04/04 04:15:28.57 Y9bxvDcN.net
>>286
> そんなんするくらいなら、makefileのほうが万倍マシやな!w
> makeと違って、個別ターゲットの指定もできないし。
たった>>265のコードだけで個別ターゲット指定できてるんだが?w
makeの「依存ファイルに基づいてビルドするターゲットを決める」という
メイン機能を使わないなら>>265だけでいい。
シバンがないからこれがシェルスクリプト全体だってわからなかったか?
#!/bin/sh
target1() { echo "target1"; }
target2() { echo "target2"; }
target3() { echo "target3"; }
"$@"
↑これをmake.shとかいうファイル名で作って
./make.sh target1ってやってみ、ちゃんと動作するから
もし ./make.sh target1 target2 target3 みたいに
複数ターゲット指定できるようにしたいなら単にループすればいい
for target in "$@"; do
"$target"
done
お前にとってのmakeの価値はこのたった3行のコードにすぎんよ
一行でも書けるがw
# お前に必要なmakeコマンドの実装
for target; do "$target"; done
296:252
21/04/04 06:36:12.78 0QnJQanX.net
まさに、それを書きやすくしたのが、
>>252
に書いた、タスクランナー
Ruby のRake, Thor などで、タスクを指定できる。
タスク同士の依存・実行順序も指定できる
297:デフォルトの名無しさん
21/04/04 06:54:28.00 Y9bxvDcN.net
>>289
まあ実際それらを使っても書きやすくなってないんだけどなw
シェルスクリプトで手に負えなくなる規模ってのを
実際に見たことがないよ
298:デフォルトの名無しさん
21/04/04 10:55:57.93 Y9bxvDcN.net
たまたまビルドを作る必要があってMakefileにちゃんと依存関係を書いてみたが
やっぱり数個程度のファイルしかない場合は過剰なんだよなw
そしてその依存関係の定義はちゃんと正しいのか見なきゃいけなないという
タスクごとにそのまま書いたほうが分かりやすいっていうね
299:デフォルトの名無しさん
21/04/04 12:21:35.65 Y9bxvDcN.net
依存関係の定義なくしたw
正確に言えば依存ファイルの定義だな
依存のタスクは残しているが、依存ファイルはどうでもいいや
タスクを実行したら�
300:ナ初からビルドしなおしても時間はかからんし
301:デフォルトの名無しさん
21/04/04 12:30:56.36 sWeAOgyW.net
矮小化した自分に都合に良い条件でしか考えられない
連投さえして同じとこぐるぐる回ってるだけって馬鹿犬かよ
302:デフォルトの名無しさん
21/04/04 12:42:29.55 Y9bxvDcN.net
自分に都合に良い条件で考えるのは足り前
正確に言えば、実際のプロジェクトにいい条件ってこと
架空のプロジェクトを相手にしたってしょうがない
303:デフォルトの名無しさん
21/04/04 13:10:39.02 sWeAOgyW.net
プロジェクトってw
想像できませんってだけのそんなレスできるんだから趣味での経験しかないんだろうな
吠えて煩いだけの馬鹿犬だな
304:デフォルトの名無しさん
21/04/04 13:30:29.59 rmqTiba5.net
>>288
all : task1 task2 task3
task1: prepare
task2: prepare
task3: prepare
prepare :
という構成で、タスクは並列可、prepareは超重い、となると、makeが最適解やろ。
305:デフォルトの名無しさん
21/04/04 15:51:18.30 Y9bxvDcN.net
>>295
じゃお前が具体例だしたら?
想像できるって言ったんだから言えるよね
それとも口だけ?
306:デフォルトの名無しさん
21/04/04 15:53:37.76 Y9bxvDcN.net
>>296
task1 &
task2 &
task3 &
wait
でおわりやん
307:デフォルトの名無しさん
21/04/04 16:57:04.88 WsuFFQM2.net
狂犬
308:デフォルトの名無しさん
21/04/04 19:44:32.02 rmqTiba5.net
>>298
勝手に終わりにしとるだけやん!w
309:デフォルトの名無しさん
21/04/05 04:28:41.70 gsx4ZFoJ.net
終わりじゃない理由でもあるの?
310:デフォルトの名無しさん
21/04/05 06:19:20.07 3jUc8O+L.net
prepare無視して勝手に終わりにしてるってとこだろ
無視というかただわかってないからだろうけど
311:デフォルトの名無しさん
21/04/05 06:33:48.44 Ir9xQslo.net
そう言われてから出すとしたら等価ではないのをまた出しそうでだな
312:デフォルトの名無しさん
21/04/05 08:37:32.95 gsx4ZFoJ.net
その前にprepareが何なのか言えよ
ただ実行する以外に何が違うのか書いてないのに
あとつけで違うとか言うなよ
313:デフォルトの名無しさん
21/04/05 08:49:07.73 Ir9xQslo.net
わかってないこと多すぎなのになぜもそう偉そうなのか
314:デフォルトの名無しさん
21/04/05 09:09:31.93 Ir9xQslo.net
>>304
prepareはprepareだろう。その意味意図がわからないのはちょっとなあ
知らないのにそんなに偉そうなのは恥以外の何物でもない、恥の上塗りだな
>>296がそう意図してるのかは不明だが、>>296のでできるのは>>298だけじゃないからな
親切なヒントやったぞ。さあ、どうぞ
315:デフォルトの名無しさん
21/04/05 10:59:23.34 gsx4ZFoJ.net
>>306
じゃあそれ以外の意図があるならそれを書いてくれ
task1関数、task2関数、task3関数 の一行目に
prepare関数を実行すれば終わりだろ?
316:デフォルトの名無しさん
21/04/05 11:01:51.92 gsx4ZFoJ.net
複数のタスクを指定したときにprepareを一回しか実行しないというのであれば
all関数の最初に一回だけ書いてもいいし
フラグを使って一回だけ実行するようにしてもいい(たった一行で実現可能)
動かしたい通りに書けば良い
317:デフォルトの名無しさん
21/04/05 11:04:18.21 i9PX2oQn.net
気持ち悪いスレだなあ
318:デフォルトの名無しさん
21/04/05 11:04:54.93 gsx4ZFoJ.net
leftpad事件と同じ匂いを感じててしまうな
われわれ(俺除くw)はこんな簡単なコードも書けなくなってしまったのか?
319:デフォルトの名無しさん
21/04/05 11:22:30.40 i9PX2oQn.net
>>284
棲み分けられるか正直疑問だし、御高説垂れにくい初心者スレ的なのはどうだろうか
320:デフォルトの名無しさん
21/04/05 11:52:33.18 qeGrbie0.net
>>308
そんなクソコードに頼らずとも使えるのがmakeなんやで!w
321:デフォルトの名無しさん
21/04/05 12:42:09.26 gsx4ZFoJ.net
>>312
makeはすぐ複雑化するよ
URLリンク(quruli.ivory.ne.jp)
C. 複雑なMakefileの例
ここにGNU makeプログラムのmakefileがあり、それは比較的複雑なものです。
322:デフォルトの名無しさん
21/04/05 12:43:47.04 gsx4ZFoJ.net
このMakefileを見て以下の情報を読み取るのは困難
> ここでは、最初のターゲットなのでデフォルトのゴールは‘all’です。
> この makefileの興味深い特徴は、‘testpad.h’がtestpadプログラムに よって
> 自動的に作成されるソースファイルである点です。そして、その プログラム自身は‘testpad.c’のコンパイルによるものです。
> ‘make’あるいは‘make all’と入力することでmakeが実行可能な ‘tar’、
> テープアクセスを提供する‘rmt’デーモン、‘tar.info’の Infoファイルを作成します。
> ‘make install’と入力すると、‘tar’、‘rmt’、‘tar.info’の 作成だけでなく、それらのインストールも行ないます。
> ‘make clean’と入力すると、makeは‘.o’ファイル、 ‘tar’、‘rmt’、‘testpad’、
> ‘testpad.h’、そして ‘core’ファイルをすべて削除します。
> ‘make distclean’と入力すると、makeは‘make clean’と同じ 削除以外に‘TAGS’、
> ‘Makefile’、そして‘config.status’ファイルも 削除します。
> (明らかではありませんが、このmakefileと‘config.status’は configureプログラムに
> よって作成されたもので、これはtarの 配布プログラムに含まれています。しかし、ここではそれは表示されていません。)
> ‘make realclean’と入力すると、makeは‘make distclean’の ときと同じ削除を行ない、
> さらに‘tar.texinfo’から生成されたInfoファイルの 削除も行ないます。
> さらに、ここでは、配布キットを作成するためのターゲットsharと distも示されています。
323:デフォルトの名無しさん
21/04/05 12:52:05.95 4wNso/hW.net
Makefileが複雑化するのはビルドする工程が複雑化しているという別の問題の顕在化でしかないでしょ
それと同じことができるシェルスクリプトを書くのとMakefileを書くのとどっちが簡単かって話じゃないの
324:デフォルトの名無しさん
21/04/05 13:07:34.94 i9PX2oQn.net
話題に挙がったついでだけどそこでtsortよ
ルールだけ抜き出して可視化しリファクタリングしなさい
325:デフォルトの名無しさん
21/04/05 13:09:49.69 gsx4ZFoJ.net
>>315
複雑なビルド工程をMakefileだと
・依存関係の定義として記述するのが正しいとされ、シェルスクリプトとしての柔軟性もないので
細切れのタスクが多数できてしまい、見づらくエスケープされたシェルスクリプト等を埋め込むことになる
と言ってます。
Makefileからシェルスクリプトを呼び出すんじゃなくて
シェルスクリプトから(必要な場合に必要な所だけ)makeを呼び出したほうがいいんだよ
そして大抵はmakeはいらない。多くの人がタスクランナーとして使ってるのはそういうこと
本当にmakeが必要なのは、C言語のような古い言語で、ヘッダファイルとソースファイルから
オブジェクトファイルを作ってリンクするような作業の部分だけでしょ?
つまり>>314に書いてあるタスクの殆どはmakeを使う必要がないってこと