シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
探検
シェルスクリプト総合 その33
■ このスレッドは過去ログ倉庫に格納されています
2020/03/23(月) 01:12:30.31ID:TYte82vJ
117デフォルトの名無しさん
2020/04/10(金) 16:00:20.83ID:nukGJGZx118デフォルトの名無しさん
2020/04/10(金) 16:04:50.67ID:vdvhEun4 Linux愛好者?って偏屈だよね
俺Linux知ってるけどお前に教えないワラって感じで性格悪い
そのあたりでLinuxが浸透しない原因
そして今日もMSの株価時価総額1位
俺Linux知ってるけどお前に教えないワラって感じで性格悪い
そのあたりでLinuxが浸透しない原因
そして今日もMSの株価時価総額1位
119デフォルトの名無しさん
2020/04/10(金) 16:26:01.02ID:pLdRSiLY 時価総額の世界第一は違うぞ
第3位のAppleの時価総額はさほど第2位のMicrosoftとさほど変わらんが同等に見てるってことだな、お前は
第3位のAppleの時価総額はさほど第2位のMicrosoftとさほど変わらんが同等に見てるってことだな、お前は
120デフォルトの名無しさん
2020/04/10(金) 16:32:36.01ID:ix9xeN7W マイクロソフト信者やパソコンの大先生のよた話はもういいよ
121デフォルトの名無しさん
2020/04/10(金) 16:50:45.63ID:5/MlN8IX 時価総額世界一はマイクロソフトだぞ?
ずっと前に奪還したって聞いたんだがな
https://stocks.finance.yahoo.co.jp/us/ranking/?kd=4&tm=d
1〜50件 / 6370件中最終更新日時:2020年4月10日7時40分
順位 名称・ティッカー・市場 取引値 前日比・前日差 時価総額 掲示板
1 マイクロソフト [MSFT] - NASDAQ 165.14 (04/09 17:20) +0.01% (+0.01) 1,256,062,603千
2 アップル [AAPL] - NASDAQ 267.99 (04/09 17:20) +0.72% (+1.92) 1,172,584,885千
3 アマゾン・ドット・コム [AMZN] - NASDAQ 2042.76 (04/09 17:20) -0.01% (-0.24) 1,016,907,263千
ずっと前に奪還したって聞いたんだがな
https://stocks.finance.yahoo.co.jp/us/ranking/?kd=4&tm=d
1〜50件 / 6370件中最終更新日時:2020年4月10日7時40分
順位 名称・ティッカー・市場 取引値 前日比・前日差 時価総額 掲示板
1 マイクロソフト [MSFT] - NASDAQ 165.14 (04/09 17:20) +0.01% (+0.01) 1,256,062,603千
2 アップル [AAPL] - NASDAQ 267.99 (04/09 17:20) +0.72% (+1.92) 1,172,584,885千
3 アマゾン・ドット・コム [AMZN] - NASDAQ 2042.76 (04/09 17:20) -0.01% (-0.24) 1,016,907,263千
122デフォルトの名無しさん
2020/04/10(金) 17:11:16.18ID:ix9xeN7W 奪還とか信者きめえ。今の世界第一はサウジアラムコな
そんな会社関係ないIT関係でとか言いそうだが
アホみたく無知を晒すなよ、それもキリリっとかでw
そんな会社関係ないIT関係でとか言いそうだが
アホみたく無知を晒すなよ、それもキリリっとかでw
123デフォルトの名無しさん
2020/04/10(金) 17:11:29.26ID:QxjVipyN スレ違い
124デフォルトの名無しさん
2020/04/10(金) 18:29:49.84ID:5gPd6BaW >>117
アスペかよwww
アスペかよwww
125デフォルトの名無しさん
2020/04/11(土) 10:25:05.95ID:md0SvLvZ × Linuxは使いものにならない
○ Linuxを使いこなせない。
だいたい,シェルスクリプトに関して言えばLinuxなんかのUnixが圧倒的に有利なんだから,
少なくともこのスレでWindowsを讃えまくっても無駄骨だと思います(指摘)。
○ Linuxを使いこなせない。
だいたい,シェルスクリプトに関して言えばLinuxなんかのUnixが圧倒的に有利なんだから,
少なくともこのスレでWindowsを讃えまくっても無駄骨だと思います(指摘)。
126デフォルトの名無しさん
2020/04/11(土) 22:43:08.40ID:7reDkQuk 自炊できない自分を棚にあげて親のメシマズをあげつらう僕ちゃん
127デフォルトの名無しさん
2020/04/11(土) 23:13:07.29ID:OL9J6aZ0 厳密にいうとシェルスクリプトではないのですが、
wsl や cygwin で
$ mv 'テスト' test
とすると
test\r
というファイルができてしまいます。
test
というファイルにするにはどうすればいいですか?
wsl や cygwin で
$ mv 'テスト' test
とすると
test\r
というファイルができてしまいます。
test
というファイルにするにはどうすればいいですか?
128デフォルトの名無しさん
2020/04/12(日) 10:26:07.71ID:3CnLqbrV129デフォルトの名無しさん
2020/04/12(日) 10:44:52.40ID:6aAn44p0 マジなわけねーだろw
130デフォルトの名無しさん
2020/04/12(日) 11:29:32.30ID:kH7j2wOo ls で見ると
'test'$'\r'
というファイルができています
sed とか tr とかいろいろ試しているのですが、\rが取れません。
'test'$'\r'
というファイルができています
sed とか tr とかいろいろ試しているのですが、\rが取れません。
131デフォルトの名無しさん
2020/04/12(日) 11:55:26.80ID:qLm4HprE Windowsだから改行がCRLFになってCRがファイル名として処理されたんだろうね
昔そうなった記憶があるようなないような
普通ならエラーになったような気がするんだけどね
試してないけど名前変えたいだけならGUIでログインしてファイルマネージャで修正できると思う
コマンドラインならESC押しながら補完したらコマンドで触れる有効なファイル名になった気がする
昔そうなった記憶があるようなないような
普通ならエラーになったような気がするんだけどね
試してないけど名前変えたいだけならGUIでログインしてファイルマネージャで修正できると思う
コマンドラインならESC押しながら補完したらコマンドで触れる有効なファイル名になった気がする
132デフォルトの名無しさん
2020/04/12(日) 11:59:52.48ID:qLm4HprE CRLFのCRが原因だろうけど
シェルスクリプトなら改行コード変換してみるとか
ターミナルならTeraTerm使うとかでしのいで
根本対処は後にした方がいいと思う
うちはcygwinの環境もうないしWSLも使わんわ
もっぱら仮想環境かラズパイ
昔仕事でcygwin使ってたころ
いざUnixやLinuxの実機に移したら
動かなくて痛い思いした覚えがある
シェルスクリプトなら改行コード変換してみるとか
ターミナルならTeraTerm使うとかでしのいで
根本対処は後にした方がいいと思う
うちはcygwinの環境もうないしWSLも使わんわ
もっぱら仮想環境かラズパイ
昔仕事でcygwin使ってたころ
いざUnixやLinuxの実機に移したら
動かなくて痛い思いした覚えがある
133デフォルトの名無しさん
2020/04/12(日) 12:03:30.62ID:KtYGSQjQ stty igncr
mv $'test\r' test
Windows/MS-DOSなテキストファイル(CRLFが改行)に書いて実行したとか
mv $'test\r' test
Windows/MS-DOSなテキストファイル(CRLFが改行)に書いて実行したとか
134デフォルトの名無しさん
2020/04/12(日) 12:13:43.08ID:KtYGSQjQ ふつーーーーのTeminalアプリでは igncr にしちゃうと改行できなくなんのか
WindowsのCommand Promptからbash起動でも同じく改行できなくなんな
>>127は本当にインタラクティブでやったのか?
WindowsのCommand Promptからbash起動でも同じく改行できなくなんな
>>127は本当にインタラクティブでやったのか?
135デフォルトの名無しさん
2020/04/12(日) 12:39:56.00ID:KtYGSQjQ 送り側(Terminalアプリ)の改行はCR、受け側はCRをLFに変換してなのね
stty のそこらあたりのデフォ(-inlcr -igncr icrnl)からは。WSLでも同じ
stty igncr するとリターンキー叩いても無視されて何もできなくなるが、リターンキーの代わりにControl-JでLF送ればいいだけなのね
stty のそこらあたりのデフォ(-inlcr -igncr icrnl)からは。WSLでも同じ
stty igncr するとリターンキー叩いても無視されて何もできなくなるが、リターンキーの代わりにControl-JでLF送ればいいだけなのね
136127
2020/04/12(日) 13:16:51.20ID:kH7j2wOo シェルスクリプトでやっています。
mv "テスト" test
stty igncr
mv '$test'\r' test
というファイルを作って
$ bash ,/file
とやると
cannot execute binary file: Exec format error
とでます。インタラクティブでやらないとできないんでしょうか?
mv "テスト" test
stty igncr
mv '$test'\r' test
というファイルを作って
$ bash ,/file
とやると
cannot execute binary file: Exec format error
とでます。インタラクティブでやらないとできないんでしょうか?
137デフォルトの名無しさん
2020/04/12(日) 13:32:38.13ID:MICQg9zq そのシェルスクリプトの改行コードがCRLFになってるんじゃないですか、というのと
mv '$test'\r' test
ではなく
mv $'test\r' test
(シングルクオートの位置と数に注意)
$ bash ,/file
ではなく
$ bash ./file
or
$ bash file
で実行しましょう。
mv '$test'\r' test
ではなく
mv $'test\r' test
(シングルクオートの位置と数に注意)
$ bash ,/file
ではなく
$ bash ./file
or
$ bash file
で実行しましょう。
138デフォルトの名無しさん
2020/04/12(日) 13:34:49.83ID:QH8CCQ6c 書き間違いなのかも知れないけど、そこは
$ bash ./test
なんじゃ?
$ bash ./test
なんじゃ?
139デフォルトの名無しさん
2020/04/12(日) 13:57:36.00ID:KtYGSQjQ140デフォルトの名無しさん
2020/04/13(月) 06:27:55.73ID:bwzJgTJt POSIX準拠度を図るツールとか調べてるサイトないんかね?
141デフォルトの名無しさん
2020/04/14(火) 01:35:34.02ID:JSjD3hsj checkbashismとかは?
142デフォルトの名無しさん
2020/04/14(火) 07:04:50.30ID:ji8PXwtq143デフォルトの名無しさん
2020/04/14(火) 09:49:58.31ID:r1rqFhB1 調べてどーすんの?
144デフォルトの名無しさん
2020/04/14(火) 10:25:51.42ID:ji8PXwtq そうすりゃ自分が間違ってるのかシェルにバグが有るのかわかるだろ?
145デフォルトの名無しさん
2020/04/14(火) 10:42:05.80ID:GtUt/+gx 調べたければ公式のtest suite入手すればいい
http://get.posixcertified.ieee.org/posixfaq.html
http://get.posixcertified.ieee.org/posixfaq.html
146デフォルトの名無しさん
2020/04/16(木) 01:24:21.41ID:sXaGgreP ファイルが存在するなら上書き、しないなら新規作成ってtouchじゃなくてviでやるかんじでしょうか?
147デフォルトの名無しさん
2020/04/16(木) 01:56:40.88ID:phPWx1q3 リダイレクトでappendすればいい
$ do_something >> output.txt
$ do_something >> output.txt
148デフォルトの名無しさん
2020/04/16(木) 02:20:53.33ID:tywb42E3 bash なら、-e で、ファイルが存在すれば真
[ -e ファイル名 ]
逆に、ファイルが存在しない時に真
[ ! -e ファイル名 ]
[ -e ファイル名 ]
逆に、ファイルが存在しない時に真
[ ! -e ファイル名 ]
149デフォルトの名無しさん
2020/04/16(木) 09:20:05.32ID:pf1fo5EI >>148
これだとうまくいかないことがある
これだとうまくいかないことがある
150デフォルトの名無しさん
2020/04/16(木) 11:59:50.73ID:TtBh+dOu 上書きって言ってるから、単純に
$ do_something > output.txt
で良いんじゃない?
$ do_something > output.txt
で良いんじゃない?
151デフォルトの名無しさん
2020/04/16(木) 12:07:49.18ID:DjP17ITj >>150
普通にこれでいいな。
普通にこれでいいな。
152デフォルトの名無しさん
2020/04/16(木) 13:48:40.08ID:pf1fo5EI リダイレクトでファイルを作れるけど
リダイレクトでファイルを削除ってできないんだよな
空にすることはできるけど
リダイレクトでファイルを削除ってできないんだよな
空にすることはできるけど
153デフォルトの名無しさん
2020/04/16(木) 14:05:57.06ID:42Nlbk00 ファイルオープンとファイル作成は同居してるからな
削除は別物
削除は別物
154デフォルトの名無しさん
2020/04/16(木) 14:19:23.91ID:pf1fo5EI まあ分かるけど対象性がないと言うか
Aから出力したものをBにコピーする。の発展で
AからBに移動する。みたいな発想はなかったんかな?
そうすれば/dev/nullに移動 = 削除になったと思うんだが
移動も削除も実装w
Aから出力したものをBにコピーする。の発展で
AからBに移動する。みたいな発想はなかったんかな?
そうすれば/dev/nullに移動 = 削除になったと思うんだが
移動も削除も実装w
155デフォルトの名無しさん
2020/04/16(木) 15:26:12.37ID:MiKwJnZu 消去したいパスのリストをファイルに入れておいて(1行1パス)
cat path_list.txt | xargs rm -rf
みたいなことをしてるのですが、ファイルのパスでワイルドカード(アスタリスク)を
使いたくなりました。
単純にパスのリスト中でアスタリスクを使っても展開されないようですが、
展開させるにはどうするのがいいでしょうか。
cat path_list.txt | xargs rm -rf
みたいなことをしてるのですが、ファイルのパスでワイルドカード(アスタリスク)を
使いたくなりました。
単純にパスのリスト中でアスタリスクを使っても展開されないようですが、
展開させるにはどうするのがいいでしょうか。
156デフォルトの名無しさん
2020/04/16(木) 15:32:46.71ID:pf1fo5EI >>155
ファイル名に*という文字が含まれている場合はどうするの?
ファイル名に*という文字が含まれている場合はどうするの?
157デフォルトの名無しさん
2020/04/16(木) 15:33:05.34ID:pf1fo5EI あ、いや、「*」という名前のファイル名があったらどうするの?
158デフォルトの名無しさん
2020/04/16(木) 15:58:03.80ID:phPWx1q3 $ ls
foo.log bar.log baz.txt qux.txt *.txt input.txt
$ cat input.txt
*.log
'¥*.txt'
$ cat input.txt | xargs -I {} bash -c 'ls {}'
bar.log foo.log
*.txt
foo.log bar.log baz.txt qux.txt *.txt input.txt
$ cat input.txt
*.log
'¥*.txt'
$ cat input.txt | xargs -I {} bash -c 'ls {}'
bar.log foo.log
*.txt
159デフォルトの名無しさん
2020/04/16(木) 18:47:06.88ID:qyR5Ndp0 bash -cってどんな時に使うんです?
簡単なシェルスクリプトならググらず書けるようにはなったけどまだよく分からん
関数もaliasも使えない分安全だろうけど使いたい時はどうするの
簡単なシェルスクリプトならググらず書けるようにはなったけどまだよく分からん
関数もaliasも使えない分安全だろうけど使いたい時はどうするの
160デフォルトの名無しさん
2020/04/16(木) 19:26:09.12ID:pf1fo5EI161デフォルトの名無しさん
2020/04/16(木) 19:28:03.58ID:pf1fo5EI あと環境汚すようなときにも使うな。
関数定義してなにかしたいけど、後で消したいとか
まあサブシェルとかでもいいんだけど
関数定義してなにかしたいけど、後で消したいとか
まあサブシェルとかでもいいんだけど
162デフォルトの名無しさん
2020/04/16(木) 19:39:39.35ID:MiKwJnZu >>158
なるほどー。素晴らしい。
なるほどー。素晴らしい。
163デフォルトの名無しさん
2020/04/16(木) 21:47:35.66ID:phPWx1q3 >>159
interactive shellじゃない場合は
`shopt -s expand_aliases; source <alias設定file>` でエイリアスが展開される
$ cat .alias_and_fn
alias ll='ls -tAhG'
foo() {
echo "foobar!!"
}
$ cat input.txt | xargs -I {} bash -O expand_aliases -c $'source .alias_and_fn;¥n ll {}; foo'
行単位で読み込むときにalias展開するからaliasを設定した後に改行入れてから使う
interactiveなログインシェルとして起動したければ`bash -cli`とか
詳しくはman bashで
interactive shellじゃない場合は
`shopt -s expand_aliases; source <alias設定file>` でエイリアスが展開される
$ cat .alias_and_fn
alias ll='ls -tAhG'
foo() {
echo "foobar!!"
}
$ cat input.txt | xargs -I {} bash -O expand_aliases -c $'source .alias_and_fn;¥n ll {}; foo'
行単位で読み込むときにalias展開するからaliasを設定した後に改行入れてから使う
interactiveなログインシェルとして起動したければ`bash -cli`とか
詳しくはman bashで
164デフォルトの名無しさん
2020/04/16(木) 22:37:57.81ID:tywb42E3 bash -c は、よく見る
16556
2020/04/17(金) 06:27:50.85ID:wSTFfL+S >>56
ようやく、分かりますた!
xxx="$(command -v rbenv)"
と、端末で直接実行すると、xxx は、rbenv となって、パスが付かないのは、
すでに、rbenv という関数が定義されたファイルを読み込んでいるため、
同名のコマンドよりも先に、関数が見つかるから
一方、xxx="$(command -v rbenv)"
と、bash スクリプト内に書いて、スクリプトを実行すると、
xxx は、~/.rbenv/bin/rbenv とパスが付くのは、
rbenv という関数が定義されたファイルを読み込んでいないため、コマンドが見つかるから
シェル関数を使うには、その関数が定義されたファイルを読み込んでから使うのか
ようやく、分かりますた!
xxx="$(command -v rbenv)"
と、端末で直接実行すると、xxx は、rbenv となって、パスが付かないのは、
すでに、rbenv という関数が定義されたファイルを読み込んでいるため、
同名のコマンドよりも先に、関数が見つかるから
一方、xxx="$(command -v rbenv)"
と、bash スクリプト内に書いて、スクリプトを実行すると、
xxx は、~/.rbenv/bin/rbenv とパスが付くのは、
rbenv という関数が定義されたファイルを読み込んでいないため、コマンドが見つかるから
シェル関数を使うには、その関数が定義されたファイルを読み込んでから使うのか
166デフォルトの名無しさん
2020/04/17(金) 06:41:06.63ID:BxfxWji9 Ubuntuでシステムのシェルってdashになってるみたいですけど、確かこれってbashより
速いからって理由でしたっけ?
実際どのぐらい違うか興味があるんですが、どこかにdashとbashのベンチマーク比較した
情報とかあります? (自分でやれって? w)
速いからって理由でしたっけ?
実際どのぐらい違うか興味があるんですが、どこかにdashとbashのベンチマーク比較した
情報とかあります? (自分でやれって? w)
167デフォルトの名無しさん
2020/04/17(金) 10:38:11.77ID:9nBzfuh2168デフォルトの名無しさん
2020/04/17(金) 10:44:00.48ID:9nBzfuh2 dashを選んでるのは速度もあるしPOSIX準拠ってのもあるだろうね
169デフォルトの名無しさん
2020/04/17(金) 14:54:31.55ID:Urb0mH6b 関数を一行で書く時エラーで悩んでたけど波括弧ってに空白いるのな
foo(){ echo foo;}
小括弧だと必要ないのに何この初見殺し
foo(){ echo foo;}
小括弧だと必要ないのに何この初見殺し
170デフォルトの名無しさん
2020/04/17(金) 15:09:03.88ID:xgpGiYXu >>169
shellcheck使うといいよ
shellcheck使うといいよ
171デフォルトの名無しさん
2020/04/17(金) 15:40:41.15ID:9nBzfuh2 >>169
zshは空白無くても動く
zsh -c 'foo(){echo test;};foo
test
dashはコンパイルエラー起こらないと思いつつ、実行するとエラーになり
dash -c 'foo(){echo test;}' # コンパイルエラー起こらない
dash -c 'foo(){echo test;};foo' # でも実行すると怒られる
実は"最後の" ; がおかしい
dash -c 'foo(){echo test;} foo' # これを実行するとこうなる
{echo: not found
エラー内容から、最初の { がおかしい事がわかる。これが正解
dash -c 'foo()echo test;} foo'
test
後ろの } はただのノイズだと思われるので、とってあげても動く
dash -c 'foo()echo test; foo'
↑これは POSIX 準拠なので(笑)zshやkshやmkshでも動く
でもbashやyashでは動かない
そこから考えると
dash -c 'foo()echo test;foo' は動くということがわかるし、
dash -c 'foo()echo test;}foo' は
foo()echo test +}foo になるので、 }foo: not found と表示されることも理解できる
zshは空白無くても動く
zsh -c 'foo(){echo test;};foo
test
dashはコンパイルエラー起こらないと思いつつ、実行するとエラーになり
dash -c 'foo(){echo test;}' # コンパイルエラー起こらない
dash -c 'foo(){echo test;};foo' # でも実行すると怒られる
実は"最後の" ; がおかしい
dash -c 'foo(){echo test;} foo' # これを実行するとこうなる
{echo: not found
エラー内容から、最初の { がおかしい事がわかる。これが正解
dash -c 'foo()echo test;} foo'
test
後ろの } はただのノイズだと思われるので、とってあげても動く
dash -c 'foo()echo test; foo'
↑これは POSIX 準拠なので(笑)zshやkshやmkshでも動く
でもbashやyashでは動かない
そこから考えると
dash -c 'foo()echo test;foo' は動くということがわかるし、
dash -c 'foo()echo test;}foo' は
foo()echo test +}foo になるので、 }foo: not found と表示されることも理解できる
172デフォルトの名無しさん
2020/04/17(金) 16:52:28.83ID:nls2b0po >>171
> dash -c 'foo()echo test; foo'
>
> ↑これは POSIX 準拠なので(笑)zshやkshやmkshでも動く
> でもbashやyashでは動かない
それは bash や yash の方が正解
関数定義の本体は複合コマンド(compound command)のみ
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
ちなみに yash や posh はこれに関して、bash よりも分りやすいエラーメッセージを吐く:
% yash -c 'f() echo'
yash -c:1: syntax error: a function body must be a compound command
% posh -c 'f() echo'
posh: f: function definition must use compound command
%
> dash -c 'foo()echo test; foo'
>
> ↑これは POSIX 準拠なので(笑)zshやkshやmkshでも動く
> でもbashやyashでは動かない
それは bash や yash の方が正解
関数定義の本体は複合コマンド(compound command)のみ
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
ちなみに yash や posh はこれに関して、bash よりも分りやすいエラーメッセージを吐く:
% yash -c 'f() echo'
yash -c:1: syntax error: a function body must be a compound command
% posh -c 'f() echo'
posh: f: function definition must use compound command
%
173デフォルトの名無しさん
2020/04/17(金) 17:38:27.88ID:9nBzfuh2 >>172
compound-command は必ずしもグループ化しろとは書かれてないよ
グループ化はオプション
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04
compound-command は必ずしもグループ化しろとは書かれてないよ
グループ化はオプション
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04
174デフォルトの名無しさん
2020/04/17(金) 19:28:17.38ID:3FstJMua175デフォルトの名無しさん
2020/04/17(金) 19:40:14.03ID:nls2b0po176デフォルトの名無しさん
2020/04/17(金) 19:56:23.51ID:UJSQQO8I え,関数って一行で定義するときは
foo() echo hello;
みたいに波括弧で括る必要ないの?
知らんかった。
foo() echo hello;
みたいに波括弧で括る必要ないの?
知らんかった。
177デフォルトの名無しさん
2020/04/17(金) 19:58:37.78ID:9nBzfuh2 >>175
リンク先見ろ、Grouping Commands って書いてあるだろ
compound-command は
() や {} でグループ化してもいいし、しなくてもいい
単一のコマンドも compound-command
というか、単一のコマンドが compound-command であり
複数のコマンドをまとめる時に Grouping Commands を使う
リンク先見ろ、Grouping Commands って書いてあるだろ
compound-command は
() や {} でグループ化してもいいし、しなくてもいい
単一のコマンドも compound-command
というか、単一のコマンドが compound-command であり
複数のコマンドをまとめる時に Grouping Commands を使う
178デフォルトの名無しさん
2020/04/17(金) 19:59:07.40ID:9nBzfuh2 >>176
本来はね。でもbashで対応してないから事実上諦めるしかない。
本来はね。でもbashで対応してないから事実上諦めるしかない。
179デフォルトの名無しさん
2020/04/17(金) 20:01:55.41ID:9nBzfuh2 >>176
あとグループ化するのに使うのは {} または () なので
foo() { echo hello; } の代わりに
foo() (echo hello) と書いても良い
こっちはbashやyashも対応している。
ただし当然のことながらサブシェルで実行される。
あとグループ化するのに使うのは {} または () なので
foo() { echo hello; } の代わりに
foo() (echo hello) と書いても良い
こっちはbashやyashも対応している。
ただし当然のことながらサブシェルで実行される。
180デフォルトの名無しさん
2020/04/17(金) 20:05:05.86ID:9nBzfuh2 fname ( ) compound-command [io-redirect ...]
の最後からわかるように
foo() { echo hello; } >/dev/null や
foo() (echo hello) >/dev/null とも書ける
もちろん複数行でこのように書いてもいい
関数が出すエラーを全て捨てる場合とかに使える
foo() {
echo hello
} 2>/dev/null
の最後からわかるように
foo() { echo hello; } >/dev/null や
foo() (echo hello) >/dev/null とも書ける
もちろん複数行でこのように書いてもいい
関数が出すエラーを全て捨てる場合とかに使える
foo() {
echo hello
} 2>/dev/null
181デフォルトの名無しさん
2020/04/17(金) 20:07:41.32ID:nls2b0po182デフォルトの名無しさん
2020/04/17(金) 20:13:43.55ID:9nBzfuh2 >>181
なんのために Grouping Commands と別に説明してある思ってる?
Grouping Commands を作るための {} または () が必須じゃないから、
「compound-commands の定義は {} または () で始まる」と*書かれてない*んだよ
なんのために Grouping Commands と別に説明してある思ってる?
Grouping Commands を作るための {} または () が必須じゃないから、
「compound-commands の定義は {} または () で始まる」と*書かれてない*んだよ
183デフォルトの名無しさん
2020/04/17(金) 20:56:24.03ID:xgpGiYXu 2.9.4 Compound Commands
The shell has several programming constructs that are "compound commands", which provide control flow for commands.
Each of these compound commands has a reserved word or control operator at the beginning, and a corresponding terminator reserved word or operator at the end
でその後Compound Commandsとして上げられてるが以下の6つ
- Grouping Commands
- The for Loop
- Case Conditional Construct
- The if Conditional Construct
- The while Loop
- The until Loop
echo helloは開始・終了を示す予約語もなければ、上の6つのどれにも当てはまらないからCompound Commandではない
The shell has several programming constructs that are "compound commands", which provide control flow for commands.
Each of these compound commands has a reserved word or control operator at the beginning, and a corresponding terminator reserved word or operator at the end
でその後Compound Commandsとして上げられてるが以下の6つ
- Grouping Commands
- The for Loop
- Case Conditional Construct
- The if Conditional Construct
- The while Loop
- The until Loop
echo helloは開始・終了を示す予約語もなければ、上の6つのどれにも当てはまらないからCompound Commandではない
184デフォルトの名無しさん
2020/04/17(金) 20:57:55.90ID:xgpGiYXu foo() if true; then echo "foobar"; fi
↑こういうのはOK
↓shellcheckの解説
POSIX allows the body of a function to be any compound command, e.g. foo() for i; do :; done. Since this usage is rare, ShellCheck intentionally requires the body to be { ..; } (or ( ..; )):
https://github.com/koalaman/shellcheck/wiki/SC1064
↑こういうのはOK
↓shellcheckの解説
POSIX allows the body of a function to be any compound command, e.g. foo() for i; do :; done. Since this usage is rare, ShellCheck intentionally requires the body to be { ..; } (or ( ..; )):
https://github.com/koalaman/shellcheck/wiki/SC1064
185デフォルトの名無しさん
2020/04/17(金) 21:06:47.56ID:9nBzfuh2 >>183
Compound Commands はその6つって言いたいの?
なら以下の関数定義はPOSIX 準拠ってことだね
foo() for i in a b c; do echo $i; done
foo() case a in a) echo a; esac
foo() if [ a ]; then echo a; fi
foo() while [ $# -gt 0 ]; do echo $1; shift; done
Compound Commands はその6つって言いたいの?
なら以下の関数定義はPOSIX 準拠ってことだね
foo() for i in a b c; do echo $i; done
foo() case a in a) echo a; esac
foo() if [ a ]; then echo a; fi
foo() while [ $# -gt 0 ]; do echo $1; shift; done
186デフォルトの名無しさん
2020/04/17(金) 22:32:27.89ID:UJSQQO8I <<. dash
foo() echo hello
foo
.
hello
たしかにDashだと問題なく定義できるな……。
こんなこと始めて知ったわ。実地で使うかどうかは置いといてw
foo() echo hello
foo
.
hello
たしかにDashだと問題なく定義できるな……。
こんなこと始めて知ったわ。実地で使うかどうかは置いといてw
要するに素直に括弧でくるんどけってことやな
188デフォルトの名無しさん
2020/04/18(土) 00:16:26.14ID:sxA+eVU/189デフォルトの名無しさん
2020/04/18(土) 00:28:42.97ID:6r7FvQ+k >>169
type { }やると分かるけど{}はシェルの予約語
{}に意味があるから{ この空白も閉じる前の;}もいる
for i inをforiinにできないようなもんで
()はtypeで何も出てこないけどね
type { }やると分かるけど{}はシェルの予約語
{}に意味があるから{ この空白も閉じる前の;}もいる
for i inをforiinにできないようなもんで
()はtypeで何も出てこないけどね
190デフォルトの名無しさん
2020/04/18(土) 13:41:33.88ID:6HUqz/fc set -eの挙動について教えて下さい!
これを実行したら何も表示されずに終了されました
set -e
foo() {
false
echo foo
}
foo
echo $?
その理由はわかります
質問はfooの中身を一切変えずにset -eの状態で
fooを画面に表示させずに $? (= 1) を
取得する方法はあるのでしょうか?
これを実行したら何も表示されずに終了されました
set -e
foo() {
false
echo foo
}
foo
echo $?
その理由はわかります
質問はfooの中身を一切変えずにset -eの状態で
fooを画面に表示させずに $? (= 1) を
取得する方法はあるのでしょうか?
191デフォルトの名無しさん
2020/04/18(土) 13:58:58.99ID:iaqzJhUO { と [ は記号でなく「コマンド」
$ ls -l
を
$ ls-l
とスペースを入れないと動かなくなる
これと一緒
$ ls -l
を
$ ls-l
とスペースを入れないと動かなくなる
これと一緒
192デフォルトの名無しさん
2020/04/18(土) 15:04:41.42ID:uOWDKjxa >>190
! ret=foo
echo $?
or
if ret=$(foo); then
echo "truthy" "$ret" "$?"
else
echo "falsy" "$ret" "$?"
fi
! ret=foo
echo $?
or
if ret=$(foo); then
echo "truthy" "$ret" "$?"
else
echo "falsy" "$ret" "$?"
fi
193デフォルトの名無しさん
2020/04/18(土) 16:16:36.81ID:6HUqz/fc >>192
> ! ret=foo
なんですか、これ!?って思ったらfoo関数呼び出してないじゃないですかぁ
> if ret=$(foo); then
なるほど、これで取得できるんですねって思って
やったんですけど truthy foo 0 ってでました
> ! ret=foo
なんですか、これ!?って思ったらfoo関数呼び出してないじゃないですかぁ
> if ret=$(foo); then
なるほど、これで取得できるんですねって思って
やったんですけど truthy foo 0 ってでました
194デフォルトの名無しさん
2020/04/18(土) 16:53:00.73ID:8o9dGOG1 >>190
パイプライン (1 つの 単純なコマンド からなるものでもよい)、 括弧で囲まれた サブシェル のコマンド、 ブレース (前述の シェルの文法 を参照) で囲まれたコマンドのリストの一部として
実行されたコマンドの 1 つ が 0 でないステータスで終了した場合、即座に終了します
だから。falseの時点でどうであれメインシェルプロセスがそこで終了、echo fooなんて実行しない、もちろん呼び出し元にも戻らない
>>192は上記に続く文に沿ってのじゃないかなあ。だが、if false; then ... とかの話で、違うだろうな文的にも。わざとなのかわからんけどw
そういう動作を望んで set -e してるのにそういう動作すんなって無理じゃね
パイプライン (1 つの 単純なコマンド からなるものでもよい)、 括弧で囲まれた サブシェル のコマンド、 ブレース (前述の シェルの文法 を参照) で囲まれたコマンドのリストの一部として
実行されたコマンドの 1 つ が 0 でないステータスで終了した場合、即座に終了します
だから。falseの時点でどうであれメインシェルプロセスがそこで終了、echo fooなんて実行しない、もちろん呼び出し元にも戻らない
>>192は上記に続く文に沿ってのじゃないかなあ。だが、if false; then ... とかの話で、違うだろうな文的にも。わざとなのかわからんけどw
そういう動作を望んで set -e してるのにそういう動作すんなって無理じゃね
195デフォルトの名無しさん
2020/04/18(土) 17:07:44.49ID:8o9dGOG1 bash 限定なら、
export -f foo
bash -c 'foo' && echo $? || echo $?
で、一応動くようではあるな(ちゃんとfooでのステータス値も返る)
export -f foo
bash -c 'foo' && echo $? || echo $?
で、一応動くようではあるな(ちゃんとfooでのステータス値も返る)
196デフォルトの名無しさん
2020/04/18(土) 17:44:44.40ID:8o9dGOG1197デフォルトの名無しさん
2020/04/18(土) 17:58:24.37ID:8o9dGOG1 あぁ、$() は正常時はやっぱりダメか。そりゃそうだな(スッキリしたw)
ret=$(foo) のような、なんか工夫すればできそうな気もしないでもないが。そういうことなのね、失礼>>192
ret=$(foo) のような、なんか工夫すればできそうな気もしないでもないが。そういうことなのね、失礼>>192
198デフォルトの名無しさん
2020/04/18(土) 18:28:05.36ID:fB7EV6Kq その方針なら
export -f foo;
ret=$(bash -c 'foo; echo $?');
echo $ret;
で良いんじゃね?
export -f foo;
ret=$(bash -c 'foo; echo $?');
echo $ret;
で良いんじゃね?
199デフォルトの名無しさん
2020/04/18(土) 19:01:48.64ID:8o9dGOG1 出力結果をスクリプトで扱うために欲しいわけじゃないから
$() だと関数も外部コマンドのように別(のメイン)プロセスとして呼べる=bash固有のでなくて使えそうだなあという、ニコイチではなくどっちかの話
$() だと関数も外部コマンドのように別(のメイン)プロセスとして呼べる=bash固有のでなくて使えそうだなあという、ニコイチではなくどっちかの話
200デフォルトの名無しさん
2020/04/18(土) 19:14:49.95ID:fB7EV6Kq ああすまん、fooの出力を忘れてた。
201デフォルトの名無しさん
2020/04/18(土) 23:55:48.35ID:L3zGDU5z $ $(echo hoge)
hoge: command not found
まあ、当然そうだわな
$ $(exit 12)
$ echo $?
12
へー、コマンドねえぞとお怒りにはならんのか。空行とみなして無かったこと(?)になるのか
echo ' 'とかスペースタブだけ(?)なら許してくれる、: と違いステータスも変わらない
てことで、標準出力に何も出さなければいいのねで、
exec 9>&1
$(set -e; foo >&9) && echo $? || echo $?
でbash以外でも動くことは動く ($() 内ってCommandsでもいいのね)
$()内での set -e はない方がスッキリだが必要ないシェルもあるもあるが必要とするシェルがある
hoge: command not found
まあ、当然そうだわな
$ $(exit 12)
$ echo $?
12
へー、コマンドねえぞとお怒りにはならんのか。空行とみなして無かったこと(?)になるのか
echo ' 'とかスペースタブだけ(?)なら許してくれる、: と違いステータスも変わらない
てことで、標準出力に何も出さなければいいのねで、
exec 9>&1
$(set -e; foo >&9) && echo $? || echo $?
でbash以外でも動くことは動く ($() 内ってCommandsでもいいのね)
$()内での set -e はない方がスッキリだが必要ないシェルもあるもあるが必要とするシェルがある
202デフォルトの名無しさん
2020/04/19(日) 00:14:03.50ID:u21QryuH 例えば、Ruby のバージョンマネージャー・rbenv の、rbenv-installer の冒頭部分は、
#!/bin/bash
# コマンドの終了コードが、0以外なら強制終了する
set -e
homebrew=
# -p : タイプが「file(実行ファイル)」の時のみ実行ファイルの絶対パスを出力する
# (それ以外のタイプの場合は何も出力しない)
type -p brew >/dev/null && homebrew=1
#!/bin/bash
# コマンドの終了コードが、0以外なら強制終了する
set -e
homebrew=
# -p : タイプが「file(実行ファイル)」の時のみ実行ファイルの絶対パスを出力する
# (それ以外のタイプの場合は何も出力しない)
type -p brew >/dev/null && homebrew=1
203デフォルトの名無しさん
2020/04/21(火) 09:06:14.84ID:h1bS6DJt コマンドってファイルに書くのと実行形式を~/binに置くのとどっちがいいの
関数とエイリアスの違いは分かったけど使い分けできてないな
関数とエイリアスの違いは分かったけど使い分けできてないな
204デフォルトの名無しさん
2020/04/21(火) 10:50:42.27ID:FcWzzI7X /dev/urandomっていうデバイスファイルが,
ほんとにただのファイルとか実は同じ値ばっかり出力するデバイスファイルとか
じゃないってことを保証する方法ってある?
ほんとにただのファイルとか実は同じ値ばっかり出力するデバイスファイルとか
じゃないってことを保証する方法ってある?
205デフォルトの名無しさん
2020/04/21(火) 13:16:25.79ID:bkXsrA+q206デフォルトの名無しさん
2020/04/21(火) 15:24:10.19ID:Lx1iEb8v >>204
ないよ。
作ろうと思えば/dev/urandomを独自実装のデバイスファイルに置き換えられるんだから。
それっぽい値を返すデバイスファイルを作ろうと思えば作れる
例えばWSL1はWindowsでLinuxカーネルをエミュレートしてるんだから
/dev/urandom とかMSの独自実装のデバイスでしょ?
ないよ。
作ろうと思えば/dev/urandomを独自実装のデバイスファイルに置き換えられるんだから。
それっぽい値を返すデバイスファイルを作ろうと思えば作れる
例えばWSL1はWindowsでLinuxカーネルをエミュレートしてるんだから
/dev/urandom とかMSの独自実装のデバイスでしょ?
207デフォルトの名無しさん
2020/04/21(火) 15:27:13.15ID:Lx1iEb8v >>203
コマンドをファイルに書くって関数のこと?
CLIから呼び出す汎用的なものは~/binで
スクリプト内部で使うだけなら関数にするだけじゃないの?
そしてエイリアスはインタラクティブシェルで使うもの
bashがデフォルトでスクリプトでは無効になってるのはそういう事
コマンドをファイルに書くって関数のこと?
CLIから呼び出す汎用的なものは~/binで
スクリプト内部で使うだけなら関数にするだけじゃないの?
そしてエイリアスはインタラクティブシェルで使うもの
bashがデフォルトでスクリプトでは無効になってるのはそういう事
208デフォルトの名無しさん
2020/04/21(火) 16:17:24.29ID:fQ5b9H0O >スクリプト内部で使うだけなら関数にするだけ
と思い込んでたら、>>56みたいになるぞw
>bashがデフォルトでスクリプトでは無効になってるのはそういう事
まあ、4からか?そういう方がいいだろうと思い変えたのだろうが、--posixでは有効なんだけどな
と思い込んでたら、>>56みたいになるぞw
>bashがデフォルトでスクリプトでは無効になってるのはそういう事
まあ、4からか?そういう方がいいだろうと思い変えたのだろうが、--posixでは有効なんだけどな
209デフォルトの名無しさん
2020/04/21(火) 16:29:23.76ID:Lx1iEb8v210デフォルトの名無しさん
2020/04/21(火) 16:30:27.22ID:Lx1iEb8v https://pubs.opengroup.org/onlinepubs/9699919799/utilities/alias.html
POSIXでも interactive utilities.って言われてるぐらいだしな
POSIXでも interactive utilities.って言われてるぐらいだしな
211デフォルトの名無しさん
2020/04/21(火) 16:43:50.04ID:fQ5b9H0O >>209
残念ながら、3はそうなってない
残念ながら、3はそうなってない
212デフォルトの名無しさん
2020/04/21(火) 16:47:30.51ID:fQ5b9H0O >>210
ちゃんと読めよ
ちゃんと読めよ
213デフォルトの名無しさん
2020/04/21(火) 16:59:29.51ID:fQ5b9H0O214デフォルトの名無しさん
2020/04/21(火) 17:43:01.90ID:fQ5b9H0O >>209,211
ああ、すまん
実行できないのは最初からだし、存在さえもしないのは3以降からだな(2では存在はするが実行時エラー)
>まあ、4からか?そういう方がいいだろうと思い変えたのだろうが
の部分は間違い勘違い、すまん
ああ、すまん
実行できないのは最初からだし、存在さえもしないのは3以降からだな(2では存在はするが実行時エラー)
>まあ、4からか?そういう方がいいだろうと思い変えたのだろうが
の部分は間違い勘違い、すまん
215デフォルトの名無しさん
2020/04/21(火) 18:23:13.41ID:Lx1iEb8v21656
2020/04/21(火) 20:51:03.40ID:HADG6GDb anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える。
~/.bashrc に、下の2行を追加するだけで、各言語ごとに追加しないでも良い
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
結局、この追加した、eval で、rbenv という関数を読み込んでいたという落ちw
~/.bashrc に、下の2行を追加するだけで、各言語ごとに追加しないでも良い
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
結局、この追加した、eval で、rbenv という関数を読み込んでいたという落ちw
21756
2020/04/21(火) 20:57:08.31ID:HADG6GDb■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★9 [BFU★]
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 植田日銀総裁 「円安進行が物価高を起こしている」 ★4 [お断り★]
- 【STARTO ENTERTAINMENT】timelesz、メンバーの不適切言動を謝罪「不用意かつモラルに反した発言であった」 全員の署名入りでコメント [Ailuropoda melanoleuca★]
- 引きこもりの16歳だけどボカロ作りたい
- 【ガチ正論】一般人「中国に規制制裁されて、『中国ムカつく』じゃなくて矛先が『許さんぞ高市』になってる奴、頭おかしいの?」 ★2 [153490809]
- やばいずっとスマホいじってても寂しいわ話そうよ
- 【ぺこ専🐰】なんG 兎田ぺこら突発配信実況スレ🏡【ホロライブ▶】
- 日中戦争起きたら5日で自衛隊壊滅するらしい。じゃあ徴兵も無いし、俺等が必死になって反対してやる理由なくね? [237216734]
- NHKニュースウオッチ9「日本側は対話にオープンな姿勢で安定した日中関係を築きたい考えなのに中国が意固地で糸口が見いだせない」 [904151406]
