!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:BBiLRgnj0630デフォルトの名無しさん (ブーイモ MMb3-D3se)
2018/11/14(水) 21:50:05.93ID:D6nmDs23M $(())が展開できるものは限定されていて、$((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。
これは$(())の中だけはx=$xであると解釈できなくもないけど、算術演算をするなら$をつけないのが正しいとは読めないな。
これは$(())の中だけはx=$xであると解釈できなくもないけど、算術演算をするなら$をつけないのが正しいとは読めないな。
631デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
2018/11/14(水) 22:59:44.88ID:Da4Ohzbn0 > $((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。
一つあれば十分じゃん。逆に展開されない根拠はないんだし
そもそも ${expression} と $((expression)) という記述があるんだから
expressionの中は同じ意味のはずだろう
一つあれば十分じゃん。逆に展開されない根拠はないんだし
そもそも ${expression} と $((expression)) という記述があるんだから
expressionの中は同じ意味のはずだろう
632デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
2018/11/14(水) 23:06:12.49ID:Da4Ohzbn0 > どっかで$(( x + 1 ))がエラーになるのが怖いので。
それがエラーになるなら、とっくに検出してるだろうな。
複数のシェルで確認してるからさ
それ関連で注意が必要なのは $(($#-1))
zshだと81になる。
それがエラーになるなら、とっくに検出してるだろうな。
複数のシェルで確認してるからさ
それ関連で注意が必要なのは $(($#-1))
zshだと81になる。
633デフォルトの名無しさん (ワッチョイ 2105-jVda)
2018/11/15(木) 07:34:42.91ID:CPG8nmHa0 >>631
いや算術演算するときは$をつけないのが正しいとは何処にも書いてないけど
いや算術演算するときは$をつけないのが正しいとは何処にも書いてないけど
634デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/15(木) 08:48:01.92ID:sJsqi8La0 というか,shellcheckでの検査結果うんぬんよりも本家POSIXの記述のほうが優先して考慮されるべきだと思うのだが。
635デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 10:49:23.03ID:gWaB1LhD0 本家POSIXに$((x))が動くと書いてあるだろ
636デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 11:23:09.13ID:gWaB1LhD0 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
に書いてあるだろ
> Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value.
> The format for arithmetic expansion shall be as follows:
>
> $((expression))
>
> The expression shall be treated as if it were in double-quotes, except that a double-quote inside
> the expression is not treated specially. The shell shall expand all tokens in the expression for
> parameter expansion, command substitution, and quote removal.
まず、$(( )) の中にある。これがexpressionだ。
expand all tokens in the expression 式の中にある以下のトークンの展開、
for parameter expansion, command substitution, and quote removal.
パラメータ展開、コマンド置換、クォートの削除
> Next, the shell shall treat this as an arithmetic expression and substitute the value of the expression.
その次(Next)に この式を arithmetic expression (算術式)として扱う
つまりだ。パラメータ展開( $(($x))の$xの展開 )が行われるまでは、まだ算術式として扱う前なんだよ
そもそもだな。 x=123を見て分かる通り。変数名はxだぞ。$xじゃない。
他の言語では変数名が$で始まるものがあるが、シェルスクリプトにおいて、
$は、パラメータ展開、コマンド置換、算術展開等を行うための記号だって書いてあるだろ?
特殊変数の説明だって、$@じゃなくて@、$*じゃなくて*、$#じゃなくて#、$$じゃなくて$ と書いており
変数名とは最初の$は含まれない部分だってことが読み取れるだろ
に書いてあるだろ
> Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value.
> The format for arithmetic expansion shall be as follows:
>
> $((expression))
>
> The expression shall be treated as if it were in double-quotes, except that a double-quote inside
> the expression is not treated specially. The shell shall expand all tokens in the expression for
> parameter expansion, command substitution, and quote removal.
まず、$(( )) の中にある。これがexpressionだ。
expand all tokens in the expression 式の中にある以下のトークンの展開、
for parameter expansion, command substitution, and quote removal.
パラメータ展開、コマンド置換、クォートの削除
> Next, the shell shall treat this as an arithmetic expression and substitute the value of the expression.
その次(Next)に この式を arithmetic expression (算術式)として扱う
つまりだ。パラメータ展開( $(($x))の$xの展開 )が行われるまでは、まだ算術式として扱う前なんだよ
そもそもだな。 x=123を見て分かる通り。変数名はxだぞ。$xじゃない。
他の言語では変数名が$で始まるものがあるが、シェルスクリプトにおいて、
$は、パラメータ展開、コマンド置換、算術展開等を行うための記号だって書いてあるだろ?
特殊変数の説明だって、$@じゃなくて@、$*じゃなくて*、$#じゃなくて#、$$じゃなくて$ と書いており
変数名とは最初の$は含まれない部分だってことが読み取れるだろ
637デフォルトの名無しさん (ワッチョイ 9564-ddua)
2018/11/15(木) 11:44:50.73ID:sJsqi8La0 >>636
そのすぐあとに
x=$(($x - 1))
という記述があるんですが。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
そのすぐあとに
x=$(($x - 1))
という記述があるんですが。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
638デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 12:00:52.72ID:gWaB1LhD0 >>637
あるからなんだよ?
パラメータ展開が行われるから
x=$(($x - 1)) は x=$((100 - 1)) となって動くだろうさ
それは x=$((x - 1)) がだめな理由になってない
あるからなんだよ?
パラメータ展開が行われるから
x=$(($x - 1)) は x=$((100 - 1)) となって動くだろうさ
それは x=$((x - 1)) がだめな理由になってない
639デフォルトの名無しさん (ワッチョイ 9564-uG0O)
2018/11/15(木) 12:27:06.72ID:sJsqi8La0640デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 12:34:01.42ID:gWaB1LhD0 shellcheckは間違いだから不要と言ってるんじゃなくて、
意味がないから不要って言ってるんだよ。
お前コードチェックツールで変数が使われていませんって
指摘されたら、文法上は間違ってねーよって文句言うのかよ?
意味がないから不要って言ってるんだよ。
お前コードチェックツールで変数が使われていませんって
指摘されたら、文法上は間違ってねーよって文句言うのかよ?
641デフォルトの名無しさん (アウアウカー Sa85-57oK)
2018/11/15(木) 12:36:27.53ID:zXViJGdda ファイッ
642デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 12:36:35.34ID:gWaB1LhD0 > shellcheckの「後者にしろ」っていう判定は絶対におかしい。
後者にしろって言う判定は、前者が間違ってるって話じゃなくて、
後者もOK、だから後者はPOSIX違反ではない(POSIX違反を提案するわけがない)って話だよ
もうちょっと落ち着けよ。お前否定されたらすぐカッとなるだろw
後者にしろって言う判定は、前者が間違ってるって話じゃなくて、
後者もOK、だから後者はPOSIX違反ではない(POSIX違反を提案するわけがない)って話だよ
もうちょっと落ち着けよ。お前否定されたらすぐカッとなるだろw
643デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 12:41:58.45ID:gWaB1LhD0 > つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。
> x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。
後者が動くのであれば
>「$x」が不要という主張は完全に間違い
という主張の方が間違ってる。
そして後者は実際に動く
> x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。
後者が動くのであれば
>「$x」が不要という主張は完全に間違い
という主張の方が間違ってる。
そして後者は実際に動く
644デフォルトの名無しさん (ワッチョイ 9564-uG0O)
2018/11/15(木) 13:09:09.63ID:sJsqi8La0 前者も実際に動くんですがそれは
645デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 13:35:59.93ID:gWaB1LhD0 だから前者が動かないなんていてないだろ
前者に$(($x -1))の$xの$が意味がないから
(POSIX準拠で問題がない)後者の方が良いって話であって
たまにいるんだよな。誰かにより良いコードの提案をされたら
俺の書いたコードが間違っているっていうんか、仕様どおりだ!って怒るやつ
仕様違反だとか間違ってるかどうかの話なんかしてない
(正しいコードの範囲で)より良いコードにしましょうってことなのに
前者に$(($x -1))の$xの$が意味がないから
(POSIX準拠で問題がない)後者の方が良いって話であって
たまにいるんだよな。誰かにより良いコードの提案をされたら
俺の書いたコードが間違っているっていうんか、仕様どおりだ!って怒るやつ
仕様違反だとか間違ってるかどうかの話なんかしてない
(正しいコードの範囲で)より良いコードにしましょうってことなのに
646デフォルトの名無しさん (ワッチョイ 9564-uG0O)
2018/11/15(木) 14:51:03.70ID:sJsqi8La0 すまん。怒らせるつもりは毛頭なかったんだわ。
ただ,「標準でははこうなってますよ」と示しただけ。
まあちょっと俺の言い方もキツかったな。
言い訳させてもらうと,今までPOSIXの仕様書も読まずに
$(())算術展開は``に書き改めるべきとか,その割に[[文を使ってたりだとか
そういう人間と多く議論してきて,こっちもかなり厳密さを求めるようになってしまっていた。
正直なところ仕様違反でもほとんどの環境で動くなら,別にそっちを使ってもいいかもね。
ただ,「標準でははこうなってますよ」と示しただけ。
まあちょっと俺の言い方もキツかったな。
言い訳させてもらうと,今までPOSIXの仕様書も読まずに
$(())算術展開は``に書き改めるべきとか,その割に[[文を使ってたりだとか
そういう人間と多く議論してきて,こっちもかなり厳密さを求めるようになってしまっていた。
正直なところ仕様違反でもほとんどの環境で動くなら,別にそっちを使ってもいいかもね。
647デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 14:58:36.45ID:gWaB1LhD0 だから仕様違反じゃないつってるだろうが
なんでこいつ理解能力無いんだろう?
冷静なふりして、冷静じゃないだろ
なんでこいつ理解能力無いんだろう?
冷静なふりして、冷静じゃないだろ
648デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
2018/11/15(木) 15:08:37.91ID:gWaB1LhD0 $(($x - 1)) と $((x - 1)) のどちらも仕様違反じゃないのに
$(($x - 1)) が動くってことは、 $((x - 1)) は仕様違反に違いニダ!って
どういう思考回路なんだろ?
$(($x - 1)) と $((x - 1)) は前者が先に$xのパラメータ展開が行われるため動作に違いがある
https://github.com/koalaman/shellcheck/wiki/SC2004 に書いてあるとおり。
それはおそらく意図しないものだろうから警告される。
お前がPOSIXの仕様を読んでいない相手と議論してきたとか知らんが、
お前なんかよりも shellcheck の作者の方がよっぽどPOSIXの仕様に詳しいだろうよ
なにせシェルスクリプトの構文解析機を作ってるし、
世界中から間違いがあったら指摘される立場にあるんだから
$(($x - 1)) が動くってことは、 $((x - 1)) は仕様違反に違いニダ!って
どういう思考回路なんだろ?
$(($x - 1)) と $((x - 1)) は前者が先に$xのパラメータ展開が行われるため動作に違いがある
https://github.com/koalaman/shellcheck/wiki/SC2004 に書いてあるとおり。
それはおそらく意図しないものだろうから警告される。
お前がPOSIXの仕様を読んでいない相手と議論してきたとか知らんが、
お前なんかよりも shellcheck の作者の方がよっぽどPOSIXの仕様に詳しいだろうよ
なにせシェルスクリプトの構文解析機を作ってるし、
世界中から間違いがあったら指摘される立場にあるんだから
649デフォルトの名無しさん (ブーイモ 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
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 地方で深刻移動貧困の実態「車のために働いてる」手取り15万円のシンママ月3.2万円が軽自動車の維持費 [七波羅探題★]
- SNSを一触即発の“地雷原”に変えた「叩き活」の正体…推し活よりも“嫌いな相手を叩く”ことに快感を覚えるのはなぜか [おっさん友の会★]
- 「これらも違反として検挙しています」岡山県警の注意喚起に「教習所行き直したほうがいい」 [試オ波羅探題★]
- 【ファッション】「同級生に笑われたことも」現役女子大生が「全身レギンス姿」で大学に通う理由…日本に「アスレジャー」は定着するのか [湛然★]
- 【芸能】奈良・橿原市に「エドモンド本田」突っ張り銅像…市長「世界中の人に楽しんでもらいたい」 [湛然★]
- 外国人の不動産所有状況を一元管理、登記・国籍を登録…27年度にも運用へ政府調整 [蚤の市★]
- 古市憲寿「スタジオでも中国批判して気持ち良くなってる人はいるが高市答弁で日本人は損してる。国益を害した」スタジオ凍りつく★2 [931948549]
- 【悲報】自転車乗り、4月から終わる 普通に乗ってても2万3000円くらい罰金を取られる [455031798]
- チクワって懐く?
- 【訃報】東京で男女4人が練炭自殺20代くらいの男性3人、30代くらいの女性1人 [856698234]
- おじゃる丸実況するお🏡
- 【悲報】女子「なんで男って酔ってる時襲わないの?ばかなの?」→38000いいね!酔った女はセックスを求めてることが判明 [802034645]
