シェルスクリプト総合 その29

■ このスレッドは過去ログ倉庫に格納されています
2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
!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
652デフォルトの名無しさん (アウアウウー Sa91-AAco)
垢版 |
2018/11/16(金) 21:08:59.95ID:4Z/2Zn+la
気のせい
2018/11/16(金) 23:08:25.02ID:pv33BTTMM
算術展開で$付けるのはナンセンスだからやめたほうがいい
654デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/16(金) 23:43:45.38ID:HodhQ/sE0
いい感じのバカっぽさw
2018/11/17(土) 00:11:39.03ID:dLBGWOhBM
>>654
お前の書き込みがな
656デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 00:41:14.93ID:eQWBxdMf0
なんか悔しかったんかなw
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を使った変数のローカル化はダイナミックスコープなのでそれとも違う
2018/11/17(土) 01:38:27.92ID:dLBGWOhBM
>>656
お前が?w
2018/11/17(土) 09:28:35.93ID:XLrbbNN30
>>657
setって便利だよね
関数の最初に
set -- $? "$@"
として最後に
return $1
とすれば終了コードも保存できるし。
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はパラメータを取って、--以降はオプションとして解釈されないっていうやつ。
ところが俺の知識量では短いオプションを解析する部分をすごく冗長にしか書けない。いちいちループを回すせいで遅いし。
動作自体はこれでいいので、短いオプションをもうちょっとうまく解析する方法とかないかな。
2018/11/17(土) 19:14:04.69ID:DG9kgnl30
なんで、aのあとにVARくるんだ? 仕様がおかしくないか?

VARが単体の値もしくは、-cの値っていうのならまだわかるんだが
662デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 19:19:32.18ID:eQWBxdMf0
エクセルマクラーと同じ病気やね
2018/11/17(土) 19:49:25.15ID:DG9kgnl30
tarで試したが、これで動くのかよ・・・

tar czvf a.tar.gz a
tar fczv a.tar.gz a

パラメータ取る短いオプションが複数あったとき
どう解釈するのが普通なんだろ
2018/11/17(土) 20:09:39.20ID:DG9kgnl30
getoptやgetoptsは短いオプションがパラメータを取るとき、
短いオプション以降がパラメータとみなされるようだ

-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
2018/11/17(土) 20:23:56.08ID:UtANxJrV0
>>663
tarはハイフン無しでオプションを書くといい感じに並べ替えてくれる
2018/11/17(土) 20:45:00.33ID:ikDL4PRg0
つまり
-aVAR
-xyza VAR
みたいなのは許容して
-axyz VAR
は許容しないようにすればいいのかな。

まあ結局一文字オプションを扱う方法はくっそ遅いルーチンなのだがw
2018/11/17(土) 21:16:27.44ID:ikDL4PRg0
こうしてみました。
短いオプションの解析ルーチンの遅さは改善してませんが
値を取るオプションの解釈を皆さんから提示された方式に変えました。
https://paste.ubuntu.com/p/n7m8qZHwMb/
669デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 21:33:05.69ID:eQWBxdMf0
>>668
提示てwバカにされとんのやぞおまえw
2018/11/17(土) 22:38:36.24ID:ikDL4PRg0
こういういったシェルスクリプトを書くの大変なので自動的に生成してくれるのがあればいいですけどね。
Pythonのdocoptみたいな。
671デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 22:57:50.85ID:eQWBxdMf0
>>670
そういったシェルはそもそも必要とされとらんのやぞ

出来るからといってやりすぎになるのはバカの悪癖やw
改めた方がええでおまえw
2018/11/17(土) 23:25:40.65ID:4Do7jDVB0
ふつーに、getopts でええやん!
入力補完を使ったら、別にコマンドが長くてもわかりやすさ優先でかまへんわ。
2018/11/17(土) 23:58:26.07ID:2WlUsnTW0
Ruby にも、OptionParser, ARGV.getopts などのモジュールがあるので、自作などしない
2018/11/18(日) 00:47:33.69ID:tOYW/MHy0
>>667
遅い原因はcutを使うからなんだけどねw

>>668
__cnt_opd__のせいでごちゃごちゃしてる。
なんに使ってるかと思ったら、番号出してるだけだよな?
オプションは普通順番には依存しないので最終的には不要なはずだ。
逆に分かりづらくなるから、こういうのは書かないほうが良いぞ
もしくはその部分を関数に分離してそっちでカウントするとか

あと並べ替えてもいいんだな

>>670
よし、作るんだ!

>>673
作者「なかったから自作したんやで」
2018/11/18(日) 01:05:23.45ID:tOYW/MHy0
>>668
とりあえず邪魔なんで、本質的なコードと、どうでも良いコードは分けた
https://paste.ubuntu.com/p/DRf6Nzz8kM/
2018/11/18(日) 01:17:46.87ID:tOYW/MHy0
余計な変数を消したり、被演算子の部分を外出ししたりした
https://paste.ubuntu.com/p/p7VwzJZ8Hv/

あとオレがリファクタリングするときによくやるんだが、
(他人の)リファクタリングする前のコードは長いことが多い

全体を把握しやすくするためにあえて一行にしたりして短くしている。
最終的にこのような書き方をするというわけではなくて一時的な処置
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'
2018/11/18(日) 01:21:35.58ID:dx8aUZPH0
caseの後の変数はダブルコーテーションで括らなくていいって知ってた?
2018/11/18(日) 01:26:08.97ID:tOYW/MHy0
長いオプションの部分をフラットにした。
https://paste.ubuntu.com/p/Y4nTQBnTFw/

あとはクソめんどくさい一文字の部分だな。
どうするか考えとらんのだがw
仕様は変えるかもしれん。
2018/11/18(日) 01:27:00.28ID:tOYW/MHy0
>>678
うん。だから徐々に消してるよw
2018/11/18(日) 01:28:24.11ID:tOYW/MHy0
あ、いくつかパっと見でわかるミスがw
まあ途中のコードは参考だから
俺がどうやってリファクタリングしているか
2018/11/18(日) 02:04:33.63ID:tOYW/MHy0
とりあえずは大まかな仕様は変えてない
https://paste.ubuntu.com/p/SQFnqmCJs2/

変数をなくそうか、でもそうすると再帰ありの関数を追加するか
setを使わないといけなくてごちゃごちゃする。
いろいろ悩んだがとりあえずそのままにしている。

cutの呼び出しはなくしたので速くなってるはず。
といっても、この程度だとLinuxなら体感できないはずなんだがWSLでやってる?

1文字オプションの分解の所がやはり面倒だな。
知らないオプションはエラーにするようにすれば、
1文字を抜き出す必要はなくなるかもしれないが
2018/11/18(日) 02:13:58.54ID:tOYW/MHy0
>>670
> Pythonのdocoptみたいな。

あと一応あるで
https://github.com/docopt/docopts

goバイナリでオプション解析して、シェルスクリプトで
evalできるコードを出力して、そのコードで環境変数を
設定するという仕組みで、純粋なシェルスクリプト実装ではないけど
2018/11/18(日) 02:21:13.13ID:tOYW/MHy0
ちなみにオプション解析の部分は一般的に最初に一回だけ行う部分なので
被らないようにしたり、無理して変数をなくす必要はないんだけどね
2018/11/18(日) 17:17:51.79ID:Fz4U8sel0
>>674
オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
rm -i -f
としたときに「確認する」のではなく「強制的に消し」たいので。
alias rm='\rm -i'
の状態でrm -fとしたときは確認オプションが有効になるんじゃなくて強制的に消去したいよね?
2018/11/18(日) 17:19:37.66ID:Fz4U8sel0
>>682
エスパーかな?
その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな?
2018/11/18(日) 17:23:02.81ID:Fz4U8sel0
連投すまん。
ちなみにどうやら汎用性のあるシェルスクリプトではローカル変数というのはsetを使わない限り実現できないようで,
そしてsetは今まさに解析すべき引数郡がが格納されているので安易に書き換えられない。
だからPythonの慣例を参考にして前後にアンダースコアを二つ続けて(無意味だけど)ローカル変数であることを示してるつもり。
2018/11/18(日) 17:35:21.66ID:Fz4U8sel0
${numbar:-0}←これすごいアイデアですね。
シェルスクリプトの冒頭でnumber=0とかで初期化しなくても、
「カウンターを初期化するのは値が設定されてないときである」ことを利用して変数展開を行なうのか。
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を使うよりも遅くなることはないだろう
2018/11/18(日) 18:05:11.85ID:tOYW/MHy0
>>668
今回は長いコードが邪魔だったので使ったけど、
例えばnumberが環境変数としてexportされていたりしたら
おかしいことになるので最初に初期化するほうが良いけどね
毎回パラメータ展開してるからわずかとはいえ遅くなるだろうし

それよりも、所見では使い道がわからない
${var:+value}の方が凄いアイデア
シェルを作った人はよくもまあこんな応用例が
高いものを作ったもんだと思うよ
2018/11/18(日) 23:06:30.15ID:Fz4U8sel0
test <string>は<string>が非空に限り成功するのね。これも知らんかったわ……。
2018/11/21(水) 17:53:42.80ID:OLor19Fe0
しつこくてすまん。
シェルスクリプトの引数解析の話なんだが
(-cが引数を取るオプションとして)
「$ somecmd -c -- --not-a-opt」
っていうコマンドラインにおいて,
・「--」を-cオプションの引数として見るか
・「--」はいかなる場所(オプションの引数の位置だとしても)においても
 以降が被演算子であることを示すものであると見るか
どっちが自然だろう。GNU getoptは前者の解析結果を出すけど恐らく内部的には後者の解釈で
エラーになる。
2018/11/21(水) 18:33:47.11ID:UM5ff+tU0
引数取るなら何であれ引数に決まってるだろ
どうでもいいけどさ、その被演算子ってのやめてくんない?
演算子なんて登場してないんだから
2018/11/21(水) 18:55:25.78ID:OLor19Fe0
operandって被演算子のことだと思うんだけど。
まあ「--」を引数と見るってことね。ありがとう。
2018/11/21(水) 19:16:12.30ID:UM5ff+tU0
だからそのoperandが出てこないって話
2018/11/21(水) 20:33:17.21ID:cLxfY5McM
operand
https://wa3.i-3-i.info/word13306.html
2018/11/21(水) 21:01:13.07ID:UM5ff+tU0
>>696
はい。どうも。 exprとか引数が何かしらの式であるものは
演算子以外の部分が被演算子(オペランド)になることはありえるけど
なんでもかんでもオペランドなわけではないよね
2018/11/21(水) 21:31:00.38ID:OLor19Fe0
ああ。ほんとだ。The Open Groupの文書を参考にする限り
somecmd -c XXX FILE
とあった場合被演算子はFILEでXXXはオプション引数だね。勘違いしてた。
2018/11/24(土) 12:14:20.49ID:I8hvszb00
Qiitaで知ったけどこの構文便利だね。
${VAL+:} false
↑これで$VAL変数が空文字だろうが定義されてさえいれば真,そうでなけば偽。
今まで[ -n ]と[ "x$VAL" = "$VAL:-x" ]とか組み合わせてたけどこれでスッキリ解決。
コマンド呼び出しも少なくなるから微妙に処理速度も上がるだろうし。

ただ難点は,test構文を用いた方法より遥かに難読になること。${VAL+:} false←これで何をやってるかなんて注釈がないと分からん。
2018/11/24(土) 12:41:53.30ID:emfrr2Lm0
>>699
なんだそりゃ? 相変わらずのQiitaクオリティなのか?

変数が定義されているかの一般的なチェック方法はこれだろ?
[ "${VAR+1}" ]
2018/11/24(土) 14:04:21.10ID:jPqivsUqa
定義されてるかどうかってどういう時に用いるんだ
C言語やってた頃は二重インポート防ぐためとかやってたけど同じような感じ?
2018/11/24(土) 14:31:59.62ID:I8hvszb00
>>700
「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?

いずれにしてもコロンコマンド(と変数展開)がシェルのビルトインとしてPOSIXで定められているのに対して
testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
外部コマンドを呼び出すのとシェルの内部でコマンドを展開するとでは後者のほうが早いよ。
君にとっては「Qittaクオリティ」でも,速度が優秀なのは君が提示したほうじゃなく「Qittaクオリティ」の方。
2018/11/24(土) 14:49:43.89ID:I8hvszb00
dashでも[はシェル組込だね。実際testユーティリティを外部コマンドに頼ってるシェルって今現在存在しているのだろうか。
Heirloom shellあたりだとありえそう(試してないけど)
2018/11/24(土) 15:54:11.31ID:emfrr2Lm0
> 「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?
ぐぐればコレばっかり見つかるはずだが?

> testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
全てのシェルで [ はビルトインだ
シェルに組み込まれていないというものがあれば教えてくれ
2018/11/24(土) 16:18:05.53ID:emfrr2Lm0
falseコマンドはPOSIXでシェルのビルトインではない
もっともどのシェルでもビルトインになっているが
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
2018/11/24(土) 17:36:50.26ID:b7tmfxF40
>>706
falseがビルトインって話じゃなかったの?w
2018/11/24(土) 17:38:22.47ID:b7tmfxF40
> ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。

"${VAR+:}"で検索したけど5件しかなかったよ?

"${VAR+x}"だと約 3,410,000 件
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
2018/11/24(土) 17:44:33.96ID:I8hvszb00
>>707
以下>>704の書き込みを引用
> > testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
> 全てのシェルで [ はビルトインだ
> シェルに組み込まれていないというものがあれば教えてくれ

ということでfalse(1)ユーティリティの話ではなく
test(1)ユーティリティがシェル組込みかどうかという話でした。
2018/11/24(土) 17:47:23.27ID:I8hvszb00
ちなみにfalse(1)ユーティリティもPOSIXにおいてシェル組込みとして定められている訳ではない。
2018/11/24(土) 17:49:01.92ID:362BcdsM0
となると処理速度的にはどっちが良いの?
2018/11/24(土) 17:50:38.66ID:b7tmfxF40
いや、俺が言ったことを復唱されてもこまるんだがw

ちなみにビルトインかどうかはPATHを空にして実行できるかどうかでわかるよ
builtinやtypeがないシェルもあるからね
2018/11/24(土) 17:51:02.76ID:b7tmfxF40
>>712
大差なし
2018/11/24(土) 18:05:17.83ID:I8hvszb00
>>712
大差ないけど,ただ,もしもPOSIXで定めらていないのを理由にしてtest(1)ユーティリティを組み込んでいないシェルがあったとして
そのシェルにおいては変数展開(これは確実にシェルが仕事する)のほうがtest(1)ユーティリティをforkしてexecするより若干早いので
速度は${VAR+:}のほうが上。
2018/11/24(土) 18:06:48.53ID:I8hvszb00
>>713
typeはPOSIXで定められているので,もしないシェルがあればPOSIX互換ではない。
つまり「ビルトインコマンド」なんていう概念はないかもしれないので,そんなことを調べるのは無駄に思えるな。
2018/11/24(土) 19:13:13.38ID:b7tmfxF40
へー、poshはPOSIX互換じゃなかったのか

>Debian Policy に準拠した普通のシェル
>posh は、pdksh の軽装版であり、Debian ポリシーの準拠を目指し、 いくつかの特別な機能を付け加えたものです。
>
>警告: Debian の /bin/sh スクリプトの多くは、実際はポリシーに準拠していると は限りませんので、
>posh を /bin/sh として使うと破損箇所が判明するかもしれま せん。

って書いてある割に大したことないな
2018/11/24(土) 20:44:49.31ID:I8hvszb00
まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくないよなw
poshも「POSIX互換じゃないシェル」として,便利に使えるようになればそれでいい。
実際,俺は使っていないものの,同級生にはfishを勧めてる。
2018/11/24(土) 20:55:10.29ID:32uSmIhta
ポジクッス警察がいるから多少はね?
2018/11/24(土) 20:57:06.31ID:b7tmfxF40
それじゃ俺も言っておかなきゃいかんのか?

まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくなくて
POSIXに準拠していなくても、現実にPOSIX互換の標準シェルとして
デフォルトシェルで採用されているのであればそれに対応すべきだと思っている

だから、dash、(busybox)ash、bash、ksh あたりは対応必須で
zsh、posh、yash、あたりは優先度が低い。mksh、pdkshは
デフォルトシェルとして採用されている事例があるのかわからんが
2018/11/24(土) 20:58:50.94ID:b7tmfxF40
俺は現実主義なんでね。標準とか仕様がどうこうよりも
現実としてそれは選択肢にならないのであれば、選択肢にならないし
非標準でも選択肢としてなり得るのならそれを使う
2018/11/24(土) 23:48:23.42ID:u7Q7GReoM
ポジコレ棒で葬ってやんよ
2018/11/25(日) 07:40:30.00ID:rsPEFWOD0
もっと面白い書き込みして、どうぞ。
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)。何千回も実行する様なケース
なら違いが分かるかも。
2018/11/25(日) 12:16:11.88ID:wMoGqmE60
POSIXでビルトインの方が速いって決まってるんだっけ?
2018/11/25(日) 12:29:43.54ID:nRWf72Y30
>>725
外部コマンドはforkが発生するから結果的にビルトインの方が速い
2018/11/25(日) 12:32:22.92ID:wMoGqmE60
いやPOSIXでどうなっているかの話だよ
728デフォルトの名無しさん (ワッチョイ ffd2-8s0F)
垢版 |
2018/11/25(日) 13:54:00.21ID:eaHucPl10
なんやこのバカwwww
2018/11/25(日) 14:01:17.29ID:nRWf72Y30
>>727
下のページをざっと見る限り規定されてないように思う
オーバヘッドがある分遅いのは自明だからPOSIXが云々は関係ない話だとは思う

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
2018/11/25(日) 18:36:53.00ID:74eaLfxV0
多分,なんでもPOSIX POSIXと言うので,からかってやろうとしたんだろう。
「お前の主張は全部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
とっても惹かれます
2018/11/26(月) 12:44:40.04ID:sgq1LDCF0
スプラッターやめろ
2018/11/26(月) 17:46:57.26ID:M+tccdiG0
echoでログを残そうとしています。
echo "メッセージ" > ログファイル

で、ログファイルはNASに保存しようと考えているのですが
NASがなんらかの原因で見えない場合、bashだと無視して処理を続けるのに
cshだと、echoのとこで止まってしまいます。
止まらないようにする方法とかないですか?
2018/11/26(月) 20:45:32.63ID:dIk0IZ2NM
>>734
その「何らかの原因」を解決するのが先決じゃねーの?
素知らぬ顔でログ残ってないならそこで止まってもらった方が良くね?
736デフォルトの名無しさん (ワッチョイ 6f9f-KQkZ)
垢版 |
2018/11/27(火) 00:51:26.43ID:IxTjeZ9T0
>>734
NFSならマウントオプションである程度はなんとかなるのでは?
Windowsの共有(cifs)の場合は知らない。しかし何かオプションあると思うけどね。
2018/11/27(火) 02:59:30.28ID:vfcz+SK40
なぜかアホの子ってnfsをローカルファイルシステムと同様に信用しちゃうよね
2018/11/27(火) 07:15:38.13ID:EYppSGpIM
唐突にお前の仲間の話しされても困る
2018/11/28(水) 08:43:07.23ID:lgqPOMnJr
>>737
信用ってのは常につながると思っちゃうってこと?
それはいかんね
2018/11/28(水) 09:03:44.81ID:6Gc6vrWs0
NFS特有のエラーがあるとは思いもしなかったりするんだよな。
挙げ句の果てにファイルロックがうまく動かないとか言い出す。
2018/11/28(水) 12:41:41.17ID:V/2Czdkr0
所詮、ネットワークを介したファイル共有だからね
ディスクはアクセスできない = 故障 と考えていいけど
ネットワークは一時的な切断やエラー、大きな遅延が想定される
だからリトライやタイムアウトといった処理を行う

通常のディスクアクセスを行うコードは、こういった
ネットワーク特有の事象について考慮されてない場合が多い

だから(NFSの設定により)ネットワーク通信が正常に完了
できるまで待ち続ける(プログラムはタイムアウトしないのでフリーズした状態)
もしくは一時的な接続不良でエラー終了したりする
2018/11/28(水) 20:10:37.32ID:N04UITTm0
シェルスクリプトの関数の名前の直後の括弧って あれはshに
「これは関数の名前ですよ」って教えるためのものっていう認識でOK?
foo() {
echo foo
}
↑こういうのの「()」。なんかCやらと同じように引数の指定とかができたらいいのにと
初心者ながら思ったんだけど そういう訳でもなさそうだし。
2018/11/28(水) 20:12:50.29ID:aLWNsKMba
えっ
744デフォルトの名無しさん (アウアウウー Sa27-ml8p)
垢版 |
2018/11/28(水) 20:22:26.38ID:wHjpMIAFa
引数は $1, $2 とかで受け取る。
呼び出す側は普通のコマンド実行のように書く。
2018/11/28(水) 20:31:09.87ID:Vqd4vFOqM
>>742
ともかく ( とか、普通使わない文字を挟んでおかないと、
foo {
だとただの引数になっちゃうから。
2018/11/29(木) 13:01:23.15ID:Msn7clch0
>>745
なるほど。
「(」はサブシェルの開始だと思ってたけど
そうでもないんだね……。
シェルの構文ってちょっと難しいことすると途端に複雑怪奇になるな(俺の頭の問題かも知れんがw)
対話的な利用を前提にした設計だから仕方無いとは言え、Pythonみたいに対話状態でもバッチ状態でも扱いやすくできなかったのかな。
2018/11/29(木) 13:04:56.47ID:lCOis1qI0
小学生が政治語ってるのを聞いてる気分だ
2018/11/29(木) 14:34:26.85ID:Msn7clch0
「どうして解散するですか?」
2018/11/29(木) 15:57:37.21ID:QFUJhwUI0
Python を使えばいいんじゃないかな
2018/11/29(木) 16:07:41.49ID:lCOis1qI0
Pythonは構文が複雑怪奇すぎる
かっこは関数呼び出しの引数の開始だと思っていたのに
関数を定義するときにも使うらしい

とかいうだろうな
751デフォルトの名無しさん (アメ MMff-egAi)
垢版 |
2018/11/29(木) 16:11:55.77ID:qd4rCcG0M
wwwww
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況