!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。
スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 3efb-m2E0)
2018/09/22(土) 11:53:21.38ID:BBiLRgnj0649デフォルトの名無しさん (ブーイモ MMf1-ed7b)
2018/11/15(木) 20:59:56.50ID:8sDmawlrM またvoid君かよ
650デフォルトの名無しさん (アウアウウー Sa91-AAco)
2018/11/16(金) 18:15:57.23ID:4Z/2Zn+la Windows用の busybox.exe なんてものがあることをたった今知った。
こんなのあったんだな。
まあしかしよくよく考えてみればWindows用のgccとかのコンパイラでコンパイルすれば良いだけだからさほど凄いことではないか。
こんなのあったんだな。
まあしかしよくよく考えてみればWindows用のgccとかのコンパイラでコンパイルすれば良いだけだからさほど凄いことではないか。
651デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/16(金) 20:52:55.20ID:0Fk/0vf10 case "$(<なにかの処理>)" in
'A'|'aaa') echo 'B' ;;
*) echo "$(<なにかの処理>)" ;;
esac
みたいな文でさ,<なにかの処理>を(できれば変数とか使わずに)一つにまとめたいんだけど
できるかな。
"$(<なにかの処理>)"の結果が'A'か'aaa'の時のみ'B'を出力して,それ以外の場合はその処理のまんまを出力したい。
RESULT="$(<なにかの処理>)"
case "$RESULT" in
'A'|'aaa') echo 'B' ;;
*) echo "$RESULT" ;;
esac
でもいいんだけどな〜んか無駄がある気がするんだよね……近い場所で二回同じ変数使ってるっていうのが。
'A'|'aaa') echo 'B' ;;
*) echo "$(<なにかの処理>)" ;;
esac
みたいな文でさ,<なにかの処理>を(できれば変数とか使わずに)一つにまとめたいんだけど
できるかな。
"$(<なにかの処理>)"の結果が'A'か'aaa'の時のみ'B'を出力して,それ以外の場合はその処理のまんまを出力したい。
RESULT="$(<なにかの処理>)"
case "$RESULT" in
'A'|'aaa') echo 'B' ;;
*) echo "$RESULT" ;;
esac
でもいいんだけどな〜んか無駄がある気がするんだよね……近い場所で二回同じ変数使ってるっていうのが。
652デフォルトの名無しさん (アウアウウー Sa91-AAco)
2018/11/16(金) 21:08:59.95ID:4Z/2Zn+la 気のせい
653デフォルトの名無しさん (ブーイモ MM2e-lnvm)
2018/11/16(金) 23:08:25.02ID:pv33BTTMM 算術展開で$付けるのはナンセンスだからやめたほうがいい
654デフォルトの名無しさん (ワッチョイ 3903-k2K5)
2018/11/16(金) 23:43:45.38ID:HodhQ/sE0 いい感じのバカっぽさw
655デフォルトの名無しさん (ブーイモ MM2e-lnvm)
2018/11/17(土) 00:11:39.03ID:dLBGWOhBM >>654
お前の書き込みがな
お前の書き込みがな
656デフォルトの名無しさん (ワッチョイ 3903-k2K5)
2018/11/17(土) 00:41:14.93ID:eQWBxdMf0 なんか悔しかったんかなw
657デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/17(土) 01:07:52.12ID:LhPQgZnG0 >>651
変数を使わないの書き方の基本の一つは引数(パラメータ)を使うことだよ
引数を変数の代わりとして使う。そのやり方に2パターンある
・パターン1 関数を作る(呼び出し先の関数の引数にする)
foo() {
case "$1" in
'A'|'aaa') echo 'B' ;;
*) echo "$1" ;;
esac
}
foo "$(<なにかの処理>)"
・パターン2 引数を再設定する(自分自身の引数にする)
set -- "$(<なにかの処理>)"
case "$1" in
'A'|'aaa') echo 'B' ;;
*) echo "$1" ;;
esac
パターン2はこのままだと自分自身の引数がなくなってしまうが、
set -- "$(<なにかの処理>)" "$@"
とすることで、残しておくことが可能。以降は引数の番号をずらして
扱うかshiftで元に戻すなりするか、引数の個数が固定なら、
set -- "$@" "$(<なにかの処理>)" と逆にしてもよい
余談だが、そんなコードを書くぐらいなら素直に変数を使えばいいと思うかもしれないが、
シェルスクリプトの変数がグローバル変数なのに対して、
引数は(レキシカルスコープ的な)ローカル変数になってるという重要な違いがある
localやtypesetを使った変数のローカル化はダイナミックスコープなのでそれとも違う
変数を使わないの書き方の基本の一つは引数(パラメータ)を使うことだよ
引数を変数の代わりとして使う。そのやり方に2パターンある
・パターン1 関数を作る(呼び出し先の関数の引数にする)
foo() {
case "$1" in
'A'|'aaa') echo 'B' ;;
*) echo "$1" ;;
esac
}
foo "$(<なにかの処理>)"
・パターン2 引数を再設定する(自分自身の引数にする)
set -- "$(<なにかの処理>)"
case "$1" in
'A'|'aaa') echo 'B' ;;
*) echo "$1" ;;
esac
パターン2はこのままだと自分自身の引数がなくなってしまうが、
set -- "$(<なにかの処理>)" "$@"
とすることで、残しておくことが可能。以降は引数の番号をずらして
扱うかshiftで元に戻すなりするか、引数の個数が固定なら、
set -- "$@" "$(<なにかの処理>)" と逆にしてもよい
余談だが、そんなコードを書くぐらいなら素直に変数を使えばいいと思うかもしれないが、
シェルスクリプトの変数がグローバル変数なのに対して、
引数は(レキシカルスコープ的な)ローカル変数になってるという重要な違いがある
localやtypesetを使った変数のローカル化はダイナミックスコープなのでそれとも違う
658デフォルトの名無しさん (ブーイモ MM2e-lnvm)
2018/11/17(土) 01:38:27.92ID:dLBGWOhBM >>656
お前が?w
お前が?w
659デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/17(土) 09:28:35.93ID:XLrbbNN30660デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/17(土) 18:51:09.82ID:ikDL4PRg0 ちょっと力を貸してほしい
https://paste.ubuntu.com/p/hx6cFRKJKm/
今、↑こういう引数処理を書いている。
動作としては
$ ./argprs.sh -abc VAR -pqr FILE --long-opt --opt-req-par="foo bar" -- --not-opt
短いオプション1: a; 'VAR'
短いオプション2: b
短いオプション3: c
短いオプション4: p
短いオプション5: q
短いオプション6: r
被演算子1: FILE
長いオプション1: long-opt
長いオプション2: opt-req-par; 'foo bar'
被演算子2: --not-opt
こういう出力ができるはず。つまり-aと--opt-req-parはパラメータを取って、--以降はオプションとして解釈されないっていうやつ。
ところが俺の知識量では短いオプションを解析する部分をすごく冗長にしか書けない。いちいちループを回すせいで遅いし。
動作自体はこれでいいので、短いオプションをもうちょっとうまく解析する方法とかないかな。
https://paste.ubuntu.com/p/hx6cFRKJKm/
今、↑こういう引数処理を書いている。
動作としては
$ ./argprs.sh -abc VAR -pqr FILE --long-opt --opt-req-par="foo bar" -- --not-opt
短いオプション1: a; 'VAR'
短いオプション2: b
短いオプション3: c
短いオプション4: p
短いオプション5: q
短いオプション6: r
被演算子1: FILE
長いオプション1: long-opt
長いオプション2: opt-req-par; 'foo bar'
被演算子2: --not-opt
こういう出力ができるはず。つまり-aと--opt-req-parはパラメータを取って、--以降はオプションとして解釈されないっていうやつ。
ところが俺の知識量では短いオプションを解析する部分をすごく冗長にしか書けない。いちいちループを回すせいで遅いし。
動作自体はこれでいいので、短いオプションをもうちょっとうまく解析する方法とかないかな。
661デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/17(土) 19:14:04.69ID:DG9kgnl30 なんで、aのあとにVARくるんだ? 仕様がおかしくないか?
VARが単体の値もしくは、-cの値っていうのならまだわかるんだが
VARが単体の値もしくは、-cの値っていうのならまだわかるんだが
662デフォルトの名無しさん (ワッチョイ 3903-k2K5)
2018/11/17(土) 19:19:32.18ID:eQWBxdMf0 エクセルマクラーと同じ病気やね
663デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/17(土) 19:49:25.15ID:DG9kgnl30 tarで試したが、これで動くのかよ・・・
tar czvf a.tar.gz a
tar fczv a.tar.gz a
パラメータ取る短いオプションが複数あったとき
どう解釈するのが普通なんだろ
tar czvf a.tar.gz a
tar fczv a.tar.gz a
パラメータ取る短いオプションが複数あったとき
どう解釈するのが普通なんだろ
664デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/17(土) 20:09:39.20ID:DG9kgnl30 getoptやgetoptsは短いオプションがパラメータを取るとき、
短いオプション以降がパラメータとみなされるようだ
-abcde で cがパラメータを取るとき、
-a -b -c de と解釈される
実装によってバラバラなのは当然だろうが
こっちのほうが楽だろうな
>>660の仕様だと、aとcがパラメータを取るとき
-abcde VAR をどう解釈して良いのかわからない
-abcde VAR1 VAR2 とすりゃいいのかもしれんが、
これは人間にとってわかりやすいんだろうか?
短いオプション以降がパラメータとみなされるようだ
-abcde で cがパラメータを取るとき、
-a -b -c de と解釈される
実装によってバラバラなのは当然だろうが
こっちのほうが楽だろうな
>>660の仕様だと、aとcがパラメータを取るとき
-abcde VAR をどう解釈して良いのかわからない
-abcde VAR1 VAR2 とすりゃいいのかもしれんが、
これは人間にとってわかりやすいんだろうか?
665デフォルトの名無しさん (ワッチョイ 3903-k2K5)
2018/11/17(土) 20:18:41.59ID:eQWBxdMf0 バカは考えるだけムダやぞw
666デフォルトの名無しさん (ワッチョイ ad23-H6Qh)
2018/11/17(土) 20:23:56.08ID:UtANxJrV0 >>663
tarはハイフン無しでオプションを書くといい感じに並べ替えてくれる
tarはハイフン無しでオプションを書くといい感じに並べ替えてくれる
667デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/17(土) 20:45:00.33ID:ikDL4PRg0 つまり
-aVAR
-xyza VAR
みたいなのは許容して
-axyz VAR
は許容しないようにすればいいのかな。
まあ結局一文字オプションを扱う方法はくっそ遅いルーチンなのだがw
-aVAR
-xyza VAR
みたいなのは許容して
-axyz VAR
は許容しないようにすればいいのかな。
まあ結局一文字オプションを扱う方法はくっそ遅いルーチンなのだがw
668660 (ワッチョイ 56be-JwVn)
2018/11/17(土) 21:16:27.44ID:ikDL4PRg0 こうしてみました。
短いオプションの解析ルーチンの遅さは改善してませんが
値を取るオプションの解釈を皆さんから提示された方式に変えました。
https://paste.ubuntu.com/p/n7m8qZHwMb/
短いオプションの解析ルーチンの遅さは改善してませんが
値を取るオプションの解釈を皆さんから提示された方式に変えました。
https://paste.ubuntu.com/p/n7m8qZHwMb/
669デフォルトの名無しさん (ワッチョイ 3903-k2K5)
2018/11/17(土) 21:33:05.69ID:eQWBxdMf0 >>668
提示てwバカにされとんのやぞおまえw
提示てwバカにされとんのやぞおまえw
670デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/17(土) 22:38:36.24ID:ikDL4PRg0 こういういったシェルスクリプトを書くの大変なので自動的に生成してくれるのがあればいいですけどね。
Pythonのdocoptみたいな。
Pythonのdocoptみたいな。
671デフォルトの名無しさん (ワッチョイ 3903-k2K5)
2018/11/17(土) 22:57:50.85ID:eQWBxdMf0672デフォルトの名無しさん (ワッチョイ 5633-wOWl)
2018/11/17(土) 23:25:40.65ID:4Do7jDVB0 ふつーに、getopts でええやん!
入力補完を使ったら、別にコマンドが長くてもわかりやすさ優先でかまへんわ。
入力補完を使ったら、別にコマンドが長くてもわかりやすさ優先でかまへんわ。
673デフォルトの名無しさん (ワッチョイ 8680-vjqa)
2018/11/17(土) 23:58:26.07ID:2WlUsnTW0 Ruby にも、OptionParser, ARGV.getopts などのモジュールがあるので、自作などしない
674デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 00:47:33.69ID:tOYW/MHy0675デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 01:05:23.45ID:tOYW/MHy0676デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 01:17:46.87ID:tOYW/MHy0 余計な変数を消したり、被演算子の部分を外出ししたりした
https://paste.ubuntu.com/p/p7VwzJZ8Hv/
あとオレがリファクタリングするときによくやるんだが、
(他人の)リファクタリングする前のコードは長いことが多い
全体を把握しやすくするためにあえて一行にしたりして短くしている。
最終的にこのような書き方をするというわけではなくて一時的な処置
https://paste.ubuntu.com/p/p7VwzJZ8Hv/
あとオレがリファクタリングするときによくやるんだが、
(他人の)リファクタリングする前のコードは長いことが多い
全体を把握しやすくするためにあえて一行にしたりして短くしている。
最終的にこのような書き方をするというわけではなくて一時的な処置
677デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 01:19:40.72ID:tOYW/MHy0 あと、これもしたな。こんな部分、あとでどうとでもなるんだからここでやることじゃない
長いオプション1: long-opt
長いオプション2: opt-req-par; 'foo bar'
↓
長いオプション1: --long-opt
長いオプション2: --opt-req-par; 'foo bar'
長いオプション1: long-opt
長いオプション2: opt-req-par; 'foo bar'
↓
長いオプション1: --long-opt
長いオプション2: --opt-req-par; 'foo bar'
678デフォルトの名無しさん (ワッチョイ 86cc-sJSV)
2018/11/18(日) 01:21:35.58ID:dx8aUZPH0 caseの後の変数はダブルコーテーションで括らなくていいって知ってた?
679デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 01:26:08.97ID:tOYW/MHy0 長いオプションの部分をフラットにした。
https://paste.ubuntu.com/p/Y4nTQBnTFw/
あとはクソめんどくさい一文字の部分だな。
どうするか考えとらんのだがw
仕様は変えるかもしれん。
https://paste.ubuntu.com/p/Y4nTQBnTFw/
あとはクソめんどくさい一文字の部分だな。
どうするか考えとらんのだがw
仕様は変えるかもしれん。
680デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 01:27:00.28ID:tOYW/MHy0 >>678
うん。だから徐々に消してるよw
うん。だから徐々に消してるよw
681デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 01:28:24.11ID:tOYW/MHy0 あ、いくつかパっと見でわかるミスがw
まあ途中のコードは参考だから
俺がどうやってリファクタリングしているか
まあ途中のコードは参考だから
俺がどうやってリファクタリングしているか
682デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 02:04:33.63ID:tOYW/MHy0 とりあえずは大まかな仕様は変えてない
https://paste.ubuntu.com/p/SQFnqmCJs2/
変数をなくそうか、でもそうすると再帰ありの関数を追加するか
setを使わないといけなくてごちゃごちゃする。
いろいろ悩んだがとりあえずそのままにしている。
cutの呼び出しはなくしたので速くなってるはず。
といっても、この程度だとLinuxなら体感できないはずなんだがWSLでやってる?
1文字オプションの分解の所がやはり面倒だな。
知らないオプションはエラーにするようにすれば、
1文字を抜き出す必要はなくなるかもしれないが
https://paste.ubuntu.com/p/SQFnqmCJs2/
変数をなくそうか、でもそうすると再帰ありの関数を追加するか
setを使わないといけなくてごちゃごちゃする。
いろいろ悩んだがとりあえずそのままにしている。
cutの呼び出しはなくしたので速くなってるはず。
といっても、この程度だとLinuxなら体感できないはずなんだがWSLでやってる?
1文字オプションの分解の所がやはり面倒だな。
知らないオプションはエラーにするようにすれば、
1文字を抜き出す必要はなくなるかもしれないが
683デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 02:13:58.54ID:tOYW/MHy0 >>670
> Pythonのdocoptみたいな。
あと一応あるで
https://github.com/docopt/docopts
goバイナリでオプション解析して、シェルスクリプトで
evalできるコードを出力して、そのコードで環境変数を
設定するという仕組みで、純粋なシェルスクリプト実装ではないけど
> Pythonのdocoptみたいな。
あと一応あるで
https://github.com/docopt/docopts
goバイナリでオプション解析して、シェルスクリプトで
evalできるコードを出力して、そのコードで環境変数を
設定するという仕組みで、純粋なシェルスクリプト実装ではないけど
684デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 02:21:13.13ID:tOYW/MHy0 ちなみにオプション解析の部分は一般的に最初に一回だけ行う部分なので
被らないようにしたり、無理して変数をなくす必要はないんだけどね
被らないようにしたり、無理して変数をなくす必要はないんだけどね
685デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/18(日) 17:17:51.79ID:Fz4U8sel0 >>674
オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
rm -i -f
としたときに「確認する」のではなく「強制的に消し」たいので。
alias rm='\rm -i'
の状態でrm -fとしたときは確認オプションが有効になるんじゃなくて強制的に消去したいよね?
オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
rm -i -f
としたときに「確認する」のではなく「強制的に消し」たいので。
alias rm='\rm -i'
の状態でrm -fとしたときは確認オプションが有効になるんじゃなくて強制的に消去したいよね?
686デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/18(日) 17:19:37.66ID:Fz4U8sel0687デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/18(日) 17:23:02.81ID:Fz4U8sel0 連投すまん。
ちなみにどうやら汎用性のあるシェルスクリプトではローカル変数というのはsetを使わない限り実現できないようで,
そしてsetは今まさに解析すべき引数郡がが格納されているので安易に書き換えられない。
だからPythonの慣例を参考にして前後にアンダースコアを二つ続けて(無意味だけど)ローカル変数であることを示してるつもり。
ちなみにどうやら汎用性のあるシェルスクリプトではローカル変数というのはsetを使わない限り実現できないようで,
そしてsetは今まさに解析すべき引数郡がが格納されているので安易に書き換えられない。
だからPythonの慣例を参考にして前後にアンダースコアを二つ続けて(無意味だけど)ローカル変数であることを示してるつもり。
688デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/18(日) 17:35:21.66ID:Fz4U8sel0 ${numbar:-0}←これすごいアイデアですね。
シェルスクリプトの冒頭でnumber=0とかで初期化しなくても、
「カウンターを初期化するのは値が設定されてないときである」ことを利用して変数展開を行なうのか。
シェルスクリプトの冒頭でnumber=0とかで初期化しなくても、
「カウンターを初期化するのは値が設定されてないときである」ことを利用して変数展開を行なうのか。
689デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 17:59:50.57ID:tOYW/MHy0 >>685
> オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
それなら変数に入れておけば良いんだよ。
競合するオプションなら、変数を同じにしておけば良い
基本的に「オプションの解析」では変数に値を入れるのみ
その場で処理はしない。変数に入れた値が後者で上書きされるから
必然的に後者が優先される
> その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな?
time dash -c 'i=0; while [ $i -lt 1000 ]; do echo a | cut -c 1 > /dev/null; i=$((i+1)); done'
Linuxでこれを実行すると約1秒。WSLでこれを実行すると15秒。fork(サブプロセス生成)が行われるとこれだけの差がでる
元々forkは遅いのだが、WSL上だと更に輪をかけて遅くなるのがわかる
これをforkなしのシェルだけで実行できる同等のコードに置き換えるとWSLで50ミリ秒に減る。Linuxだと20ミリ秒にへる
time dash -c 'i=0; while [ $i -lt 1000 ]; do v=abc; v=${v%"${v#?}"}; echo $v >/dev/null ; i=$((i+1)); done'
もっともforkなしのコードは万能ではなく、文字列の最初の一文字を取るために「文字列の最初の一文字を取り除いた残り」を
求めてから、全体から抜き取っているために、文字列が長くなると極端に遅くなる。
文字列を1文字ずつ処理するコードを書いたとして、1000文字〜1万文字程度が限界。(数秒〜数十秒かかる)
それ以上の長さの文字列を1文字ずつ処理するコードを書くならsedあたりで1文字ずつに分解して処理したほうが良いだろう
POSIX準拠しなくていいなら${v:0:1} を使ったほうが速いと思う(計測はしてない)
だけど一般的なオプション程度の長さであれば十分速い。少なくともcutを使うよりも遅くなることはないだろう
> オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
それなら変数に入れておけば良いんだよ。
競合するオプションなら、変数を同じにしておけば良い
基本的に「オプションの解析」では変数に値を入れるのみ
その場で処理はしない。変数に入れた値が後者で上書きされるから
必然的に後者が優先される
> その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな?
time dash -c 'i=0; while [ $i -lt 1000 ]; do echo a | cut -c 1 > /dev/null; i=$((i+1)); done'
Linuxでこれを実行すると約1秒。WSLでこれを実行すると15秒。fork(サブプロセス生成)が行われるとこれだけの差がでる
元々forkは遅いのだが、WSL上だと更に輪をかけて遅くなるのがわかる
これをforkなしのシェルだけで実行できる同等のコードに置き換えるとWSLで50ミリ秒に減る。Linuxだと20ミリ秒にへる
time dash -c 'i=0; while [ $i -lt 1000 ]; do v=abc; v=${v%"${v#?}"}; echo $v >/dev/null ; i=$((i+1)); done'
もっともforkなしのコードは万能ではなく、文字列の最初の一文字を取るために「文字列の最初の一文字を取り除いた残り」を
求めてから、全体から抜き取っているために、文字列が長くなると極端に遅くなる。
文字列を1文字ずつ処理するコードを書いたとして、1000文字〜1万文字程度が限界。(数秒〜数十秒かかる)
それ以上の長さの文字列を1文字ずつ処理するコードを書くならsedあたりで1文字ずつに分解して処理したほうが良いだろう
POSIX準拠しなくていいなら${v:0:1} を使ったほうが速いと思う(計測はしてない)
だけど一般的なオプション程度の長さであれば十分速い。少なくともcutを使うよりも遅くなることはないだろう
690デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/18(日) 18:05:11.85ID:tOYW/MHy0 >>668
今回は長いコードが邪魔だったので使ったけど、
例えばnumberが環境変数としてexportされていたりしたら
おかしいことになるので最初に初期化するほうが良いけどね
毎回パラメータ展開してるからわずかとはいえ遅くなるだろうし
それよりも、所見では使い道がわからない
${var:+value}の方が凄いアイデア
シェルを作った人はよくもまあこんな応用例が
高いものを作ったもんだと思うよ
今回は長いコードが邪魔だったので使ったけど、
例えばnumberが環境変数としてexportされていたりしたら
おかしいことになるので最初に初期化するほうが良いけどね
毎回パラメータ展開してるからわずかとはいえ遅くなるだろうし
それよりも、所見では使い道がわからない
${var:+value}の方が凄いアイデア
シェルを作った人はよくもまあこんな応用例が
高いものを作ったもんだと思うよ
691デフォルトの名無しさん (ワッチョイ 56be-JwVn)
2018/11/18(日) 23:06:30.15ID:Fz4U8sel0 test <string>は<string>が非空に限り成功するのね。これも知らんかったわ……。
692デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/21(水) 17:53:42.80ID:OLor19Fe0 しつこくてすまん。
シェルスクリプトの引数解析の話なんだが
(-cが引数を取るオプションとして)
「$ somecmd -c -- --not-a-opt」
っていうコマンドラインにおいて,
・「--」を-cオプションの引数として見るか
・「--」はいかなる場所(オプションの引数の位置だとしても)においても
以降が被演算子であることを示すものであると見るか
どっちが自然だろう。GNU getoptは前者の解析結果を出すけど恐らく内部的には後者の解釈で
エラーになる。
シェルスクリプトの引数解析の話なんだが
(-cが引数を取るオプションとして)
「$ somecmd -c -- --not-a-opt」
っていうコマンドラインにおいて,
・「--」を-cオプションの引数として見るか
・「--」はいかなる場所(オプションの引数の位置だとしても)においても
以降が被演算子であることを示すものであると見るか
どっちが自然だろう。GNU getoptは前者の解析結果を出すけど恐らく内部的には後者の解釈で
エラーになる。
693デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/21(水) 18:33:47.11ID:UM5ff+tU0 引数取るなら何であれ引数に決まってるだろ
どうでもいいけどさ、その被演算子ってのやめてくんない?
演算子なんて登場してないんだから
どうでもいいけどさ、その被演算子ってのやめてくんない?
演算子なんて登場してないんだから
694デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/21(水) 18:55:25.78ID:OLor19Fe0 operandって被演算子のことだと思うんだけど。
まあ「--」を引数と見るってことね。ありがとう。
まあ「--」を引数と見るってことね。ありがとう。
695デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/21(水) 19:16:12.30ID:UM5ff+tU0 だからそのoperandが出てこないって話
696デフォルトの名無しさん (ワンミングク MM5a-sJSV)
2018/11/21(水) 20:33:17.21ID:cLxfY5McM697デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
2018/11/21(水) 21:01:13.07ID:UM5ff+tU0698デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/21(水) 21:31:00.38ID:OLor19Fe0 ああ。ほんとだ。The Open Groupの文書を参考にする限り
somecmd -c XXX FILE
とあった場合被演算子はFILEでXXXはオプション引数だね。勘違いしてた。
somecmd -c XXX FILE
とあった場合被演算子はFILEでXXXはオプション引数だね。勘違いしてた。
699デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 12:14:20.49ID:I8hvszb00 Qiitaで知ったけどこの構文便利だね。
${VAL+:} false
↑これで$VAL変数が空文字だろうが定義されてさえいれば真,そうでなけば偽。
今まで[ -n ]と[ "x$VAL" = "$VAL:-x" ]とか組み合わせてたけどこれでスッキリ解決。
コマンド呼び出しも少なくなるから微妙に処理速度も上がるだろうし。
ただ難点は,test構文を用いた方法より遥かに難読になること。${VAL+:} false←これで何をやってるかなんて注釈がないと分からん。
${VAL+:} false
↑これで$VAL変数が空文字だろうが定義されてさえいれば真,そうでなけば偽。
今まで[ -n ]と[ "x$VAL" = "$VAL:-x" ]とか組み合わせてたけどこれでスッキリ解決。
コマンド呼び出しも少なくなるから微妙に処理速度も上がるだろうし。
ただ難点は,test構文を用いた方法より遥かに難読になること。${VAL+:} false←これで何をやってるかなんて注釈がないと分からん。
700デフォルトの名無しさん (ワッチョイ cf98-/G1A)
2018/11/24(土) 12:41:53.30ID:emfrr2Lm0701デフォルトの名無しさん (アウアウカー Sa87-fvbk)
2018/11/24(土) 14:04:21.10ID:jPqivsUqa 定義されてるかどうかってどういう時に用いるんだ
C言語やってた頃は二重インポート防ぐためとかやってたけど同じような感じ?
C言語やってた頃は二重インポート防ぐためとかやってたけど同じような感じ?
702デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 14:31:59.62ID:I8hvszb00 >>700
「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?
いずれにしてもコロンコマンド(と変数展開)がシェルのビルトインとしてPOSIXで定められているのに対して
testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
外部コマンドを呼び出すのとシェルの内部でコマンドを展開するとでは後者のほうが早いよ。
君にとっては「Qittaクオリティ」でも,速度が優秀なのは君が提示したほうじゃなく「Qittaクオリティ」の方。
「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?
いずれにしてもコロンコマンド(と変数展開)がシェルのビルトインとしてPOSIXで定められているのに対して
testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
外部コマンドを呼び出すのとシェルの内部でコマンドを展開するとでは後者のほうが早いよ。
君にとっては「Qittaクオリティ」でも,速度が優秀なのは君が提示したほうじゃなく「Qittaクオリティ」の方。
703デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 14:49:43.89ID:I8hvszb00 dashでも[はシェル組込だね。実際testユーティリティを外部コマンドに頼ってるシェルって今現在存在しているのだろうか。
Heirloom shellあたりだとありえそう(試してないけど)
Heirloom shellあたりだとありえそう(試してないけど)
704デフォルトの名無しさん (ワッチョイ cf98-/G1A)
2018/11/24(土) 15:54:11.31ID:emfrr2Lm0 > 「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?
ぐぐればコレばっかり見つかるはずだが?
> testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
全てのシェルで [ はビルトインだ
シェルに組み込まれていないというものがあれば教えてくれ
ぐぐればコレばっかり見つかるはずだが?
> testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
全てのシェルで [ はビルトインだ
シェルに組み込まれていないというものがあれば教えてくれ
705デフォルトの名無しさん (ワッチョイ cf98-/G1A)
2018/11/24(土) 16:18:05.53ID:emfrr2Lm0 falseコマンドはPOSIXでシェルのビルトインではない
もっともどのシェルでもビルトインになっているが
もっともどのシェルでもビルトインになっているが
706デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 17:26:54.56ID:I8hvszb00 >>704
> ググればこればっかり
ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。
> 全てのシェルで[はビルトイン
test(1)ユーティリティは,あくまでPOSIXにおいて組込ユーティリティじゃないという話。
根拠はこれ: http://pubs.opengroup.org/onlinepubs/9699919799/idx/sbi.html
> シェルに組み込まれていないというものがあれば教えてくれ
ご査収ください→https://www.unix.com/man-page/v7/1/sh/#neo-man-page-output
> ググればこればっかり
ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。
> 全てのシェルで[はビルトイン
test(1)ユーティリティは,あくまでPOSIXにおいて組込ユーティリティじゃないという話。
根拠はこれ: http://pubs.opengroup.org/onlinepubs/9699919799/idx/sbi.html
> シェルに組み込まれていないというものがあれば教えてくれ
ご査収ください→https://www.unix.com/man-page/v7/1/sh/#neo-man-page-output
707デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 17:36:50.26ID:b7tmfxF40 >>706
falseがビルトインって話じゃなかったの?w
falseがビルトインって話じゃなかったの?w
708デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 17:38:22.47ID:b7tmfxF40 > ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。
"${VAR+:}"で検索したけど5件しかなかったよ?
"${VAR+x}"だと約 3,410,000 件
"${VAR+:}"で検索したけど5件しかなかったよ?
"${VAR+x}"だと約 3,410,000 件
709デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 17:41:59.00ID:I8hvszb00 ちなみに「すべてのシェル」と言うくらいなのだから,
主要でありPOSIX互換を謳うGNU Bash, Zsh, Debian Almquist shell(dash), yash, MirOS ksh(mksh)くらいについては知らべてるとは思うものの,
POSIXの記述を知らないようなので,
一応,これら5つのシェルがtest(1)ユーティリティを組込コマンドにしているという根拠を以下に挙げておこう。
GNU Bash: https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
Zsh: http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#Shell-Builtin-Commands
dash: http://man7.org/linux/man-pages/man1/dash.1.html
yash: https://yash.osdn.jp/doc/ja/#alpha-order
mksh: https://www.mirbsd.org/htman/i386/man1/mksh.htm
主要でありPOSIX互換を謳うGNU Bash, Zsh, Debian Almquist shell(dash), yash, MirOS ksh(mksh)くらいについては知らべてるとは思うものの,
POSIXの記述を知らないようなので,
一応,これら5つのシェルがtest(1)ユーティリティを組込コマンドにしているという根拠を以下に挙げておこう。
GNU Bash: https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
Zsh: http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#Shell-Builtin-Commands
dash: http://man7.org/linux/man-pages/man1/dash.1.html
yash: https://yash.osdn.jp/doc/ja/#alpha-order
mksh: https://www.mirbsd.org/htman/i386/man1/mksh.htm
710デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 17:44:33.96ID:I8hvszb00711デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 17:47:23.27ID:I8hvszb00 ちなみにfalse(1)ユーティリティもPOSIXにおいてシェル組込みとして定められている訳ではない。
712デフォルトの名無しさん (ワッチョイ ffb3-8s0F)
2018/11/24(土) 17:49:01.92ID:362BcdsM0 となると処理速度的にはどっちが良いの?
713デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 17:50:38.66ID:b7tmfxF40 いや、俺が言ったことを復唱されてもこまるんだがw
ちなみにビルトインかどうかはPATHを空にして実行できるかどうかでわかるよ
builtinやtypeがないシェルもあるからね
ちなみにビルトインかどうかはPATHを空にして実行できるかどうかでわかるよ
builtinやtypeがないシェルもあるからね
714デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 17:51:02.76ID:b7tmfxF40 >>712
大差なし
大差なし
715デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 18:05:17.83ID:I8hvszb00 >>712
大差ないけど,ただ,もしもPOSIXで定めらていないのを理由にしてtest(1)ユーティリティを組み込んでいないシェルがあったとして
そのシェルにおいては変数展開(これは確実にシェルが仕事する)のほうがtest(1)ユーティリティをforkしてexecするより若干早いので
速度は${VAR+:}のほうが上。
大差ないけど,ただ,もしもPOSIXで定めらていないのを理由にしてtest(1)ユーティリティを組み込んでいないシェルがあったとして
そのシェルにおいては変数展開(これは確実にシェルが仕事する)のほうがtest(1)ユーティリティをforkしてexecするより若干早いので
速度は${VAR+:}のほうが上。
716デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 18:06:48.53ID:I8hvszb00 >>713
typeはPOSIXで定められているので,もしないシェルがあればPOSIX互換ではない。
つまり「ビルトインコマンド」なんていう概念はないかもしれないので,そんなことを調べるのは無駄に思えるな。
typeはPOSIXで定められているので,もしないシェルがあればPOSIX互換ではない。
つまり「ビルトインコマンド」なんていう概念はないかもしれないので,そんなことを調べるのは無駄に思えるな。
717デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 19:13:13.38ID:b7tmfxF40 へー、poshはPOSIX互換じゃなかったのか
>Debian Policy に準拠した普通のシェル
>posh は、pdksh の軽装版であり、Debian ポリシーの準拠を目指し、 いくつかの特別な機能を付け加えたものです。
>
>警告: Debian の /bin/sh スクリプトの多くは、実際はポリシーに準拠していると は限りませんので、
>posh を /bin/sh として使うと破損箇所が判明するかもしれま せん。
って書いてある割に大したことないな
>Debian Policy に準拠した普通のシェル
>posh は、pdksh の軽装版であり、Debian ポリシーの準拠を目指し、 いくつかの特別な機能を付け加えたものです。
>
>警告: Debian の /bin/sh スクリプトの多くは、実際はポリシーに準拠していると は限りませんので、
>posh を /bin/sh として使うと破損箇所が判明するかもしれま せん。
って書いてある割に大したことないな
718デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/24(土) 20:44:49.31ID:I8hvszb00 まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくないよなw
poshも「POSIX互換じゃないシェル」として,便利に使えるようになればそれでいい。
実際,俺は使っていないものの,同級生にはfishを勧めてる。
別にシェルってPOSIX shに準拠してる必要性なんてまったくないよなw
poshも「POSIX互換じゃないシェル」として,便利に使えるようになればそれでいい。
実際,俺は使っていないものの,同級生にはfishを勧めてる。
719デフォルトの名無しさん (アウアウカー Sa87-fvbk)
2018/11/24(土) 20:55:10.29ID:32uSmIhta ポジクッス警察がいるから多少はね?
720デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 20:57:06.31ID:b7tmfxF40 それじゃ俺も言っておかなきゃいかんのか?
まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくなくて
POSIXに準拠していなくても、現実にPOSIX互換の標準シェルとして
デフォルトシェルで採用されているのであればそれに対応すべきだと思っている
だから、dash、(busybox)ash、bash、ksh あたりは対応必須で
zsh、posh、yash、あたりは優先度が低い。mksh、pdkshは
デフォルトシェルとして採用されている事例があるのかわからんが
まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくなくて
POSIXに準拠していなくても、現実にPOSIX互換の標準シェルとして
デフォルトシェルで採用されているのであればそれに対応すべきだと思っている
だから、dash、(busybox)ash、bash、ksh あたりは対応必須で
zsh、posh、yash、あたりは優先度が低い。mksh、pdkshは
デフォルトシェルとして採用されている事例があるのかわからんが
721デフォルトの名無しさん (ワッチョイ e398-/G1A)
2018/11/24(土) 20:58:50.94ID:b7tmfxF40 俺は現実主義なんでね。標準とか仕様がどうこうよりも
現実としてそれは選択肢にならないのであれば、選択肢にならないし
非標準でも選択肢としてなり得るのならそれを使う
現実としてそれは選択肢にならないのであれば、選択肢にならないし
非標準でも選択肢としてなり得るのならそれを使う
722デフォルトの名無しさん (ブーイモ MM1f-XNyg)
2018/11/24(土) 23:48:23.42ID:u7Q7GReoM ポジコレ棒で葬ってやんよ
723デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
2018/11/25(日) 07:40:30.00ID:rsPEFWOD0 もっと面白い書き込みして、どうぞ。
724デフォルトの名無しさん (ワッチョイ ffb3-8s0F)
2018/11/25(日) 12:05:00.87ID:Yow09MRJ0 >>715
その前提条件で言えば false も組み込みじゃないかもしれないのだから同じじゃないの?
変数が定義されていれば false は実行されないけど、未定義かどうかを確認したいから
実行するわけで。
ただ、fork and exec に関して言えば test コマンドが 1.1ms, false コマンド は 0.8ms 程度
(コマンドバイナリのテキストセクションがメモリキャッシュされている場合で、実行環境は
Intel Xeon E3-1220 3.1GHz/Linux kernel 4.15.0/glibc 2.27)。何千回も実行する様なケース
なら違いが分かるかも。
その前提条件で言えば false も組み込みじゃないかもしれないのだから同じじゃないの?
変数が定義されていれば false は実行されないけど、未定義かどうかを確認したいから
実行するわけで。
ただ、fork and exec に関して言えば test コマンドが 1.1ms, false コマンド は 0.8ms 程度
(コマンドバイナリのテキストセクションがメモリキャッシュされている場合で、実行環境は
Intel Xeon E3-1220 3.1GHz/Linux kernel 4.15.0/glibc 2.27)。何千回も実行する様なケース
なら違いが分かるかも。
725デフォルトの名無しさん (ワッチョイ d398-/G1A)
2018/11/25(日) 12:16:11.88ID:wMoGqmE60 POSIXでビルトインの方が速いって決まってるんだっけ?
726デフォルトの名無しさん (ワッチョイ e323-G2K7)
2018/11/25(日) 12:29:43.54ID:nRWf72Y30 >>725
外部コマンドはforkが発生するから結果的にビルトインの方が速い
外部コマンドはforkが発生するから結果的にビルトインの方が速い
727デフォルトの名無しさん (ワッチョイ d398-/G1A)
2018/11/25(日) 12:32:22.92ID:wMoGqmE60 いやPOSIXでどうなっているかの話だよ
728デフォルトの名無しさん (ワッチョイ ffd2-8s0F)
2018/11/25(日) 13:54:00.21ID:eaHucPl10 なんやこのバカwwww
729デフォルトの名無しさん (ワッチョイ e323-G2K7)
2018/11/25(日) 14:01:17.29ID:nRWf72Y30 >>727
下のページをざっと見る限り規定されてないように思う
オーバヘッドがある分遅いのは自明だからPOSIXが云々は関係ない話だとは思う
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
下のページをざっと見る限り規定されてないように思う
オーバヘッドがある分遅いのは自明だからPOSIXが云々は関係ない話だとは思う
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
730デフォルトの名無しさん (ワッチョイ c364-m15j)
2018/11/25(日) 18:36:53.00ID:74eaLfxV0 多分,なんでもPOSIX POSIXと言うので,からかってやろうとしたんだろう。
「お前の主張は全部POSIXに起源があるのか?」ってな。
まあ結果としてはネタにマジレスの嵐だった訳だがw
「お前の主張は全部POSIXに起源があるのか?」ってな。
まあ結果としてはネタにマジレスの嵐だった訳だがw
731デフォルトの名無しさん (オッペケ Sr47-ZXAZ)
2018/11/26(月) 12:25:16.95ID:RdZe26lCr 必死すぎる言い訳のせいで逆にひかれてしまったパターンw
732デフォルトの名無しさん (アメ MMe7-9KmN)
2018/11/26(月) 12:32:05.28ID:mqDjQZG/M とっても惹かれます
733デフォルトの名無しさん (ワッチョイ cf98-/G1A)
2018/11/26(月) 12:44:40.04ID:sgq1LDCF0 スプラッターやめろ
734デフォルトの名無しさん (ワッチョイ c336-CvEX)
2018/11/26(月) 17:46:57.26ID:M+tccdiG0 echoでログを残そうとしています。
echo "メッセージ" > ログファイル
で、ログファイルはNASに保存しようと考えているのですが
NASがなんらかの原因で見えない場合、bashだと無視して処理を続けるのに
cshだと、echoのとこで止まってしまいます。
止まらないようにする方法とかないですか?
echo "メッセージ" > ログファイル
で、ログファイルはNASに保存しようと考えているのですが
NASがなんらかの原因で見えない場合、bashだと無視して処理を続けるのに
cshだと、echoのとこで止まってしまいます。
止まらないようにする方法とかないですか?
735デフォルトの名無しさん (ドコグロ MMc7-I6zH)
2018/11/26(月) 20:45:32.63ID:dIk0IZ2NM736デフォルトの名無しさん (ワッチョイ 6f9f-KQkZ)
2018/11/27(火) 00:51:26.43ID:IxTjeZ9T0737デフォルトの名無しさん (ワッチョイ 638a-OaPJ)
2018/11/27(火) 02:59:30.28ID:vfcz+SK40 なぜかアホの子ってnfsをローカルファイルシステムと同様に信用しちゃうよね
738デフォルトの名無しさん (ドコグロ MMdf-I6zH)
2018/11/27(火) 07:15:38.13ID:EYppSGpIM 唐突にお前の仲間の話しされても困る
739デフォルトの名無しさん (オッペケ Sr47-U4w/)
2018/11/28(水) 08:43:07.23ID:lgqPOMnJr740デフォルトの名無しさん (ワッチョイ 638a-OaPJ)
2018/11/28(水) 09:03:44.81ID:6Gc6vrWs0 NFS特有のエラーがあるとは思いもしなかったりするんだよな。
挙げ句の果てにファイルロックがうまく動かないとか言い出す。
挙げ句の果てにファイルロックがうまく動かないとか言い出す。
741デフォルトの名無しさん (ワッチョイ d398-/G1A)
2018/11/28(水) 12:41:41.17ID:V/2Czdkr0 所詮、ネットワークを介したファイル共有だからね
ディスクはアクセスできない = 故障 と考えていいけど
ネットワークは一時的な切断やエラー、大きな遅延が想定される
だからリトライやタイムアウトといった処理を行う
通常のディスクアクセスを行うコードは、こういった
ネットワーク特有の事象について考慮されてない場合が多い
だから(NFSの設定により)ネットワーク通信が正常に完了
できるまで待ち続ける(プログラムはタイムアウトしないのでフリーズした状態)
もしくは一時的な接続不良でエラー終了したりする
ディスクはアクセスできない = 故障 と考えていいけど
ネットワークは一時的な切断やエラー、大きな遅延が想定される
だからリトライやタイムアウトといった処理を行う
通常のディスクアクセスを行うコードは、こういった
ネットワーク特有の事象について考慮されてない場合が多い
だから(NFSの設定により)ネットワーク通信が正常に完了
できるまで待ち続ける(プログラムはタイムアウトしないのでフリーズした状態)
もしくは一時的な接続不良でエラー終了したりする
742デフォルトの名無しさん (ワッチョイ c364-m15j)
2018/11/28(水) 20:10:37.32ID:N04UITTm0 シェルスクリプトの関数の名前の直後の括弧って あれはshに
「これは関数の名前ですよ」って教えるためのものっていう認識でOK?
foo() {
echo foo
}
↑こういうのの「()」。なんかCやらと同じように引数の指定とかができたらいいのにと
初心者ながら思ったんだけど そういう訳でもなさそうだし。
「これは関数の名前ですよ」って教えるためのものっていう認識でOK?
foo() {
echo foo
}
↑こういうのの「()」。なんかCやらと同じように引数の指定とかができたらいいのにと
初心者ながら思ったんだけど そういう訳でもなさそうだし。
743デフォルトの名無しさん (アウアウカー Sa87-fvbk)
2018/11/28(水) 20:12:50.29ID:aLWNsKMba えっ
744デフォルトの名無しさん (アウアウウー Sa27-ml8p)
2018/11/28(水) 20:22:26.38ID:wHjpMIAFa 引数は $1, $2 とかで受け取る。
呼び出す側は普通のコマンド実行のように書く。
呼び出す側は普通のコマンド実行のように書く。
745デフォルトの名無しさん (ブーイモ MMe7-X8Q6)
2018/11/28(水) 20:31:09.87ID:Vqd4vFOqM746デフォルトの名無しさん (ワッチョイ db64-VZvV)
2018/11/29(木) 13:01:23.15ID:Msn7clch0 >>745
なるほど。
「(」はサブシェルの開始だと思ってたけど
そうでもないんだね……。
シェルの構文ってちょっと難しいことすると途端に複雑怪奇になるな(俺の頭の問題かも知れんがw)
対話的な利用を前提にした設計だから仕方無いとは言え、Pythonみたいに対話状態でもバッチ状態でも扱いやすくできなかったのかな。
なるほど。
「(」はサブシェルの開始だと思ってたけど
そうでもないんだね……。
シェルの構文ってちょっと難しいことすると途端に複雑怪奇になるな(俺の頭の問題かも知れんがw)
対話的な利用を前提にした設計だから仕方無いとは言え、Pythonみたいに対話状態でもバッチ状態でも扱いやすくできなかったのかな。
747デフォルトの名無しさん (ワッチョイ 5f98-r3MB)
2018/11/29(木) 13:04:56.47ID:lCOis1qI0 小学生が政治語ってるのを聞いてる気分だ
748デフォルトの名無しさん (ワッチョイ db64-VZvV)
2018/11/29(木) 14:34:26.85ID:Msn7clch0 「どうして解散するですか?」
■ このスレッドは過去ログ倉庫に格納されています
