シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
362デフォルトの名無しさん
2019/07/23(火) 17:17:45.59ID:vatz3/hX >>361
申し訳ないです。完全に見落してました。
申し訳ないです。完全に見落してました。
363デフォルトの名無しさん
2019/07/23(火) 23:34:58.45ID:JEktaXSk npmでシェルスクリプトだけのパッケージを配布してもOKですか?
364デフォルトの名無しさん
2019/07/24(水) 01:15:44.75ID:ArGZw8p9 npmスレに。
365デフォルトの名無しさん
2019/07/24(水) 21:22:10.25ID:ArGZw8p9 >>361
catとreadってたった一行読み込むのにそんな差ある?
catとreadってたった一行読み込むのにそんな差ある?
366デフォルトの名無しさん
2019/07/25(木) 02:49:23.09ID:WafvXnG3 1行だからcatが遅いんだろ
367デフォルトの名無しさん
2019/07/25(木) 02:51:27.80ID:muDuQw8n ついcatなって言った
368デフォルトの名無しさん
2019/07/25(木) 08:46:34.39ID:m8sWcejF こawkあいはしていない。
369デフォルトの名無しさん
2019/07/25(木) 14:59:51.08ID:VsjL1nxe sedで質問です。
置換前
(a0b1c2=99999) (a0b1c2=00000)
置換後
DATA1=99999 DATA2=00000
こんな感じに置換したいです。
カッコと接頭辞みたいなのを除去した上で、
行の1つめはDATA1に、2つめはDATA2に置換したいという意味です。
何卒ご教示ください。
置換前
(a0b1c2=99999) (a0b1c2=00000)
置換後
DATA1=99999 DATA2=00000
こんな感じに置換したいです。
カッコと接頭辞みたいなのを除去した上で、
行の1つめはDATA1に、2つめはDATA2に置換したいという意味です。
何卒ご教示ください。
370デフォルトの名無しさん
2019/07/25(木) 15:04:52.21ID:D8pzUtDE (
[a-zA-Z0-9]
=
[0-9]+
)
こんな形のデータか?
[a-zA-Z0-9]
=
[0-9]+
)
こんな形のデータか?
371デフォルトの名無しさん
2019/07/25(木) 15:09:40.46ID:D8pzUtDE 暫定これ
echo "(a0b1c2=99999) (a0b1c2=00000)" | sed -n 's/([a-zA-Z0-9]\+=\([0-9]\+\)) ([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
DATA1=99999 DATA2=00000
echo "(a0b1c2=99999) (a0b1c2=00000)" | sed -n 's/([a-zA-Z0-9]\+=\([0-9]\+\)) ([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
DATA1=99999 DATA2=00000
372デフォルトの名無しさん
2019/07/25(木) 15:11:16.41ID:VsjL1nxe >>370
すいません、話を簡単にするため>>369は端折ったんですが、
端折らない方がよさそうなので元データそのまま書きます。
わかる人にはわかるかもしれませんが、VMwareのAPIから取ってきた値です。
guest(01) %!s(int32=110) %!s(int32=3625)
これは左からゲスト名、各ゲストのCPU使用量(MHz)、メモリ使用量(MB)です。
これを
guest(01) CPU=110 Memory=3625
こんな感じにしたいなと思っています。
最初はsedの単純な置換とパイプで何とかしようとしたんですが、
ゲスト名にもカッコが使われてる(のが除去されちゃう)という部分が回避できませんでした。
すいません、話を簡単にするため>>369は端折ったんですが、
端折らない方がよさそうなので元データそのまま書きます。
わかる人にはわかるかもしれませんが、VMwareのAPIから取ってきた値です。
guest(01) %!s(int32=110) %!s(int32=3625)
これは左からゲスト名、各ゲストのCPU使用量(MHz)、メモリ使用量(MB)です。
これを
guest(01) CPU=110 Memory=3625
こんな感じにしたいなと思っています。
最初はsedの単純な置換とパイプで何とかしようとしたんですが、
ゲスト名にもカッコが使われてる(のが除去されちゃう)という部分が回避できませんでした。
373デフォルトの名無しさん
2019/07/25(木) 15:20:38.81ID:D8pzUtDE echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -n 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
guest(01) DATA1=110 DATA2=3625
これで間にあう?
guest(01) DATA1=110 DATA2=3625
これで間にあう?
374デフォルトの名無しさん
2019/07/25(木) 15:22:34.93ID:D8pzUtDE 失礼しました
最後のCPU, Memoryに書きかえて
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -e 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/CPU=\1 Memory=\2/g'
guest(01) CPU=110 Memory=3625
最後のCPU, Memoryに書きかえて
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -e 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/CPU=\1 Memory=\2/g'
guest(01) CPU=110 Memory=3625
375デフォルトの名無しさん
2019/07/25(木) 15:27:23.74ID:hsvk8oNq >>361
パイプにテキストファイルの中身を流し込んで逐次処理するとき、
cat "hoge.txt" | 〜 のほかに、
echo $(< "hoge.txt") | 〜 とか、
lessなどのページャー読み込みでもできるけど、
どうするかいつも悩むなぁ。
grepなどの、ファイル読み込みオプションのあるコマンドが先頭ならそれを使えばいいけど、
そうでない場合は、みんなどうしてる?
パイプにテキストファイルの中身を流し込んで逐次処理するとき、
cat "hoge.txt" | 〜 のほかに、
echo $(< "hoge.txt") | 〜 とか、
lessなどのページャー読み込みでもできるけど、
どうするかいつも悩むなぁ。
grepなどの、ファイル読み込みオプションのあるコマンドが先頭ならそれを使えばいいけど、
そうでない場合は、みんなどうしてる?
376デフォルトの名無しさん
2019/07/25(木) 15:44:25.16ID:qx5YGZv4 >>375
何故 < hoge.txt じゃ駄目なの?
何故 < hoge.txt じゃ駄目なの?
377デフォルトの名無しさん
2019/07/25(木) 15:57:19.67ID:VsjL1nxe378デフォルトの名無しさん
2019/07/25(木) 17:02:25.09ID:hsvk8oNq >>376
複数のパイプを繋げた逐次処理の場合に、
処理元のファイルが何であるかを明確にしたいので、
すべてのパイプの先頭に持っていきたいんだよ。
ファイル読み込み | 処理1 | 処理2 | 処理3…
複数のパイプを繋げた逐次処理の場合に、
処理元のファイルが何であるかを明確にしたいので、
すべてのパイプの先頭に持っていきたいんだよ。
ファイル読み込み | 処理1 | 処理2 | 処理3…
379デフォルトの名無しさん
2019/07/25(木) 17:18:56.17ID:vvE0ECJG 俺なら
< hoge.txt cmd1 | cmd2 | cmd3 ...
と書く
< hoge.txt cmd1 | cmd2 | cmd3 ...
と書く
380デフォルトの名無しさん
2019/07/25(木) 17:34:33.11ID:hsvk8oNq >>379
ほぉ、リダイレクトって、コマンドの前にもってこれるんだ。ありがとう。
これならとりあえず、ソースを明確にできるね。
しかもおそらく一番処理が速いかな。
catを使った方法のような、単に読み込むだけのコマンドの高速版みたいなのはないのかなぁ。
ほぉ、リダイレクトって、コマンドの前にもってこれるんだ。ありがとう。
これならとりあえず、ソースを明確にできるね。
しかもおそらく一番処理が速いかな。
catを使った方法のような、単に読み込むだけのコマンドの高速版みたいなのはないのかなぁ。
381デフォルトの名無しさん
2019/07/25(木) 18:20:54.41ID:D8pzUtDE >>377
正規表現は実行可能な回戦ノイズになりやすいから、
複雑なものは、可能なら perl を薦める
バックスラッシュの頻度も下がり、空白で単位ごとに分けられ読みやすい
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe 's{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) \N{SPACE} \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) }{CPU=$1 Memory=$2}xg'
guest(01) CPU=110 Memory=3625
sedの正規表現にはいくつか注意すべきことがあると思う
match部の
( が 文字どおりの ( にマッチする
\( が あとで \1 \2 で使う為のキャプチャの括弧になる。
\+ が1つ以上の という個数指定になる
正規表現は実行可能な回戦ノイズになりやすいから、
複雑なものは、可能なら perl を薦める
バックスラッシュの頻度も下がり、空白で単位ごとに分けられ読みやすい
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe 's{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) \N{SPACE} \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) }{CPU=$1 Memory=$2}xg'
guest(01) CPU=110 Memory=3625
sedの正規表現にはいくつか注意すべきことがあると思う
match部の
( が 文字どおりの ( にマッチする
\( が あとで \1 \2 で使う為のキャプチャの括弧になる。
\+ が1つ以上の という個数指定になる
382デフォルトの名無しさん
2019/07/25(木) 18:41:30.57ID:m8sWcejF ……Perlも十分読み難いと思うのは俺だけだろうか…
383デフォルトの名無しさん
2019/07/25(木) 18:52:29.83ID:I5POGkj3 perl が使えるような環境なら sed -E 使えるんじゃね?
384デフォルトの名無しさん
2019/07/25(木) 19:47:46.86ID:D8pzUtDE >>382
もっと分かりやすそうに書いてみた
今度はどうだ?
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe ' $pattern = q{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) } ; s/$pattern \N{SPACE} $pattern/CPU=$1 Memory=$2/x'
guest(01) CPU=110 Memory=3625
もっと分かりやすそうに書いてみた
今度はどうだ?
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe ' $pattern = q{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) } ; s/$pattern \N{SPACE} $pattern/CPU=$1 Memory=$2/x'
guest(01) CPU=110 Memory=3625
385デフォルトの名無しさん
2019/07/25(木) 21:09:49.52ID:AjtfUs9C386デフォルトの名無しさん
2019/07/25(木) 22:22:57.77ID:1GqrqsZl これぐらいのの複雑さになると、perl でちゃんと改行、インデントして
書いた方がいいような気がする
書いた方がいいような気がする
387デフォルトの名無しさん
2019/07/26(金) 00:44:50.95ID:16gdYth6 シェルスクリプトは関数型だとかアホなこと言ってるブログがあった
388デフォルトの名無しさん
2019/07/26(金) 10:46:37.80ID:54Ib42km Ruby では、
def get_value( str ) # = ) の間にある文字列を取得する
pos_1 = str.rindex "=" # 文字を末尾から探す
pos_2 = str.rindex ")"
str[ pos_1 + 1 ... pos_2 ]
end
str = 'guest(01) %!s(int32=110) %!s(int32=3625)'
ary = str.split # 空白で区切る
# ["guest(01)", "%!s(int32=110)", "%!s(int32=3625)"]
puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"
# guest(01) CPU=110 Memory=3625
1-liner では、
ただし、途中で改行したので、1行にしてください!
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | ruby -ne 'def get_value( str ) pos_1 = str.rindex "="; pos_2 = str.rindex ")"; str[ pos_1 + 1 ... pos_2 ] end;
ary = $_.split; puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"'
def get_value( str ) # = ) の間にある文字列を取得する
pos_1 = str.rindex "=" # 文字を末尾から探す
pos_2 = str.rindex ")"
str[ pos_1 + 1 ... pos_2 ]
end
str = 'guest(01) %!s(int32=110) %!s(int32=3625)'
ary = str.split # 空白で区切る
# ["guest(01)", "%!s(int32=110)", "%!s(int32=3625)"]
puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"
# guest(01) CPU=110 Memory=3625
1-liner では、
ただし、途中で改行したので、1行にしてください!
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | ruby -ne 'def get_value( str ) pos_1 = str.rindex "="; pos_2 = str.rindex ")"; str[ pos_1 + 1 ... pos_2 ] end;
ary = $_.split; puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"'
389デフォルトの名無しさん
2019/07/26(金) 12:22:34.47ID:AGnOcgvd >>388
死ね
死ね
390デフォルトの名無しさん
2019/07/27(土) 10:41:07.02ID:6v++aFZ1 上の方の数値判定だけどマイナス記号を考えない(つまり正整数だけを判定する)のなら
[ ! ${var%%[0-9]*} ]
これが最速で(記述も)最短じゃなかろうか。
[ ! ${var%%[0-9]*} ]
これが最速で(記述も)最短じゃなかろうか。
391デフォルトの名無しさん
2019/07/27(土) 11:54:57.07ID:z4Poa3yK 真っ直ぐに一直線ですか?
392デフォルトの名無しさん
2019/07/27(土) 13:52:23.75ID:QzyB/IP7 >>390
シェルのパターンマッチングでの '*' って any string の意味なので、
$ var='10abcdefg'
$ [ ! ${var%%[0-9]*} ] && echo integer
integer
となってしまう。bash の extglob を使うなら、
$ [ ! ${var%%?([-+])+([0-9])} ] && echo integer
などと書ける(空文字の場合に対応してないけど)。
シェルのパターンマッチングでの '*' って any string の意味なので、
$ var='10abcdefg'
$ [ ! ${var%%[0-9]*} ] && echo integer
integer
となってしまう。bash の extglob を使うなら、
$ [ ! ${var%%?([-+])+([0-9])} ] && echo integer
などと書ける(空文字の場合に対応してないけど)。
393デフォルトの名無しさん
2019/07/27(土) 15:15:37.83ID:6v++aFZ1394デフォルトの名無しさん
2019/07/27(土) 19:04:12.75ID:6v++aFZ1 突飛なことはせずcase分使うのが一番いいのかな。
正直、俺だったらそもそも「型」の概念が必要になるようなプログラムは
シェルスクリプトで書かないけど
正直、俺だったらそもそも「型」の概念が必要になるようなプログラムは
シェルスクリプトで書かないけど
395デフォルトの名無しさん
2019/07/28(日) 00:29:26.94ID:LPR+u+AV * は、シェルスクリプトでは、0文字以上の任意の文字列で、
正規表現では、直前の文字の0回以上の繰り返し
正規表現を使うのなら、egrep, grep -e でフィルターしないといけない
egrep '正規表現'
これもシェルで解釈されないように、シングルクォーテーションで囲む方がよい
正規表現では、直前の文字の0回以上の繰り返し
正規表現を使うのなら、egrep, grep -e でフィルターしないといけない
egrep '正規表現'
これもシェルで解釈されないように、シングルクォーテーションで囲む方がよい
396デフォルトの名無しさん
2019/07/28(日) 00:33:37.21ID:7n7RswoS perlは正規表現しか知らんが構文は結構読みにくいのね
pythonやruby辺りやった方がいいのかな
簡単なシェルスクリプトを書いたりsedやawkで弄ったりはしてるけど
pythonやruby辺りやった方がいいのかな
簡単なシェルスクリプトを書いたりsedやawkで弄ったりはしてるけど
397デフォルトの名無しさん
2019/07/28(日) 01:42:13.12ID:/N9EqgUo シェルスクリプトとしてはワンライナーが短く書け、
カオスも含めた無限のような表現力のあるperl を薦める
seq 30 | perl -0777 -ne 'print $_ =()= /1/g'
13
カオスも含めた無限のような表現力のあるperl を薦める
seq 30 | perl -0777 -ne 'print $_ =()= /1/g'
13
398デフォルトの名無しさん
2019/07/28(日) 02:18:58.47ID:UCGA8APU seq 30 | tr -dc '1' | wc -c
でいいんじゃね
でいいんじゃね
399デフォルトの名無しさん
2019/07/28(日) 02:37:29.23ID:/N9EqgUo 旨い
2文字以上じゃないことを利用する柔軟性見事
2文字以上じゃないことを利用する柔軟性見事
400デフォルトの名無しさん
2019/07/28(日) 03:11:34.56ID:vKAr7iFy401デフォルトの名無しさん
2019/07/28(日) 04:13:22.82ID:/N9EqgUo はい
402デフォルトの名無しさん
2019/07/28(日) 04:28:55.80ID:LPR+u+AV Ruby では、1 の個数を数える
seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
403デフォルトの名無しさん
2019/07/28(日) 04:30:02.41ID:vKAr7iFy 何の意味があんの?
Perlだと複雑に書けるよってこと?
Perlだと複雑に書けるよってこと?
404デフォルトの名無しさん
2019/07/28(日) 04:37:14.85ID:UCGA8APU 1 を数えたいなら
$ seq 30 | grep -o 1 | wc -l
$ seq 30 | grep -o 1 | wc -l
405デフォルトの名無しさん
2019/07/28(日) 10:48:09.20ID:/N9EqgUo きっと見たこともない構文だと思って書いた
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった
本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった
本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
406デフォルトの名無しさん
2019/07/28(日) 11:51:54.16ID:V62sQMom 改行を無視して検索は?
407デフォルトの名無しさん
2019/07/28(日) 12:45:34.52ID:/N9EqgUo 3行以上にまたがる複数行?
2行まで?
2行まで?
408デフォルトの名無しさん
2019/07/29(月) 21:57:36.07ID:LpaqQy0x PowerShell では、
$matches = 1..30 | Select-String "1" -AllMatches
$matches.Matches.Count
#=> 13
$matches = 1..30 | Select-String "1" -AllMatches
$matches.Matches.Count
#=> 13
409デフォルトの名無しさん
2019/07/30(火) 00:35:05.01ID:TDafWW+v PowerShellって嫌われてるけど結構便利だよね。
でも使い熟せる自信も気力もないw
でも使い熟せる自信も気力もないw
410デフォルトの名無しさん
2019/07/30(火) 07:02:14.50ID:lWAzz/KK PowerShellってどういう場面で使われるの?
Bash使わないでPowerShell使うことってあんの?
Bash使わないでPowerShell使うことってあんの?
411デフォルトの名無しさん
2019/07/30(火) 07:18:22.77ID:RYwsY7rK windows update からの shutdown
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
412デフォルトの名無しさん
2019/07/30(火) 07:51:48.49ID:TDafWW+v 喩えが文学的すぎて分からん
413デフォルトの名無しさん
2019/07/30(火) 18:08:45.58ID:EUusSyFO414デフォルトの名無しさん
2019/07/30(火) 18:16:09.63ID:fdfPnQnm Remove-Item、Copy-Itemとか生理的に受け付けない体になってる。
415デフォルトの名無しさん
2019/07/30(火) 18:28:39.62ID:R+5nd6EU >>413
DOcker SHell
DOcker SHell
416デフォルトの名無しさん
2019/07/30(火) 18:34:09.08ID:EUusSyFO 時代からしてそれはないだろ
417デフォルトの名無しさん
2019/07/30(火) 19:37:33.76ID:6/Ph+fdB >>408
オシャレだ
オシャレだ
418デフォルトの名無しさん
2019/07/30(火) 20:50:28.04ID:TDafWW+v >>413
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。
OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
http://schilytools.sourceforge.net/bosh.html
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。
OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
http://schilytools.sourceforge.net/bosh.html
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
419418
2019/07/30(火) 20:57:36.54ID:TDafWW+v https://unix.stackexchange.com/a/223935
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。
しかし肝心要のSolaris Bシェルの手引書
https://docs.oracle.com/cd/E56342_01/html/E54074/jsh-1.html
にはその記述が見当らず……。どゆこと???
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。
しかし肝心要のSolaris Bシェルの手引書
https://docs.oracle.com/cd/E56342_01/html/E54074/jsh-1.html
にはその記述が見当らず……。どゆこと???
420デフォルトの名無しさん
2019/07/30(火) 21:12:05.50ID:EUusSyFO >>418
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)
あと>>413のリンクが間違っていたので訂正
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)
あと>>413のリンクが間違っていたので訂正
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
421デフォルトの名無しさん
2019/07/30(火) 21:15:06.53ID:EUusSyFO ここには元ネタはUNOSとか書いてあるね。
https://unix.stackexchange.com/questions/453827/making-alias-of-rm-command
This concept of parameterizable aliases has been invented by former AT&T
employees in 1980 and implemented in their real time UNIX clone called UNOS.
https://unix.stackexchange.com/questions/453827/making-alias-of-rm-command
This concept of parameterizable aliases has been invented by former AT&T
employees in 1980 and implemented in their real time UNIX clone called UNOS.
422デフォルトの名無しさん
2019/07/30(火) 21:19:41.35ID:EUusSyFO https://www.in-ulm.de/~mascheck/bourne/
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases
あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases
あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
423デフォルトの名無しさん
2019/07/30(火) 21:26:48.89ID:EUusSyFO https://unix.stackexchange.com/questions/145522/what-does-it-mean-to-be-sh-compatible
If you like to know more relations, e.g. with UNOS "command", "bsh" and the recent
Bourne Shell, send me a note. As a hint: UNOS command had a builtin command
"do" that acted as a one-line shell script with arguments. This idea was transferred into
the Bourne Shell as "dosh" and permits parameterizable aliases, something you cannot get from ksh or bash. ? schily
このschilyってのはSchily Bourne Shell(=bosh)の作者かな?
If you like to know more relations, e.g. with UNOS "command", "bsh" and the recent
Bourne Shell, send me a note. As a hint: UNOS command had a builtin command
"do" that acted as a one-line shell script with arguments. This idea was transferred into
the Bourne Shell as "dosh" and permits parameterizable aliases, something you cannot get from ksh or bash. ? schily
このschilyってのはSchily Bourne Shell(=bosh)の作者かな?
424デフォルトの名無しさん
2019/07/30(火) 21:30:36.00ID:TDafWW+v425デフォルトの名無しさん
2019/07/30(火) 21:57:06.40ID:EUusSyFO 「OpenSolarisのシェルに携わってる」はちょっと疑問かな
http://schilytools.sourceforge.net/bosh.html
> The Schily Bourne Shell was derived from the Bourne Shell sources from OpenSolaris.
と書いてあるように、OpenSolarisのシェルをベースに改良したSchily Bourne Shellの作者のようだ。
OpenSolarisシェルそのものには関わってない気がする
Schily Bourne Shellには、古いBourne Shellと互換性があるoboshと
POSIX厳格なpboshと、POSIX準拠+拡張のboshの三種類のシェルが含まれていて、
そのboshにはOpenSolaris Bourne Shell にはない機能
> The enhanced Schily Bourne Shell (bosh) implements the following features that are missing
> in the OpenSolaris Bourne Shell listed above:
として、自身が昔仕事で関わっていたUNOS
https://unix.stackexchange.com/users/120884/schily
> First paid UNIX related work with UNOS in 1982.
で実装されていたdosh(元はビルトインコマンドの"do"?)を移植したという流れっぽい。
だからSolaris Bシェルの手引書には無くて当然なのだろう。
Bourne Shellにも移植された
> This idea was transferred into the Bourne Shell as "dosh"
ようだから、どこかの実装にはdoshが存在するのかも
http://schilytools.sourceforge.net/bosh.html
> The Schily Bourne Shell was derived from the Bourne Shell sources from OpenSolaris.
と書いてあるように、OpenSolarisのシェルをベースに改良したSchily Bourne Shellの作者のようだ。
OpenSolarisシェルそのものには関わってない気がする
Schily Bourne Shellには、古いBourne Shellと互換性があるoboshと
POSIX厳格なpboshと、POSIX準拠+拡張のboshの三種類のシェルが含まれていて、
そのboshにはOpenSolaris Bourne Shell にはない機能
> The enhanced Schily Bourne Shell (bosh) implements the following features that are missing
> in the OpenSolaris Bourne Shell listed above:
として、自身が昔仕事で関わっていたUNOS
https://unix.stackexchange.com/users/120884/schily
> First paid UNIX related work with UNOS in 1982.
で実装されていたdosh(元はビルトインコマンドの"do"?)を移植したという流れっぽい。
だからSolaris Bシェルの手引書には無くて当然なのだろう。
Bourne Shellにも移植された
> This idea was transferred into the Bourne Shell as "dosh"
ようだから、どこかの実装にはdoshが存在するのかも
426デフォルトの名無しさん
2019/07/30(火) 22:00:29.38ID:TDafWW+v427デフォルトの名無しさん
2019/07/30(火) 22:35:47.42ID:TDafWW+v 全然関係ないけど
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
428デフォルトの名無しさん
2019/07/30(火) 22:45:31.33ID:TDafWW+v 参考: http://austingroupbugs.net/view.php?id=249
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
429デフォルトの名無しさん
2019/07/31(水) 12:01:53.51ID:6BPSvdm1 >>414
get-alias (gal)で、alias を表示できる。
多くのLinux コマンドのalias も、指定されている
gal | where-object {$_.Definition -match "remove-item"}
# Remove-Item のalias は、del, erase, rd, ri, rm, rmdir
gal | where-object {$_.Definition -match "copy-item"}
# Copy-Item のalias は、copy, cp, cpi
gal -name ls
# ls -> Get-ChildItem
gal -name echo
# echo -> Write-Output
get-alias (gal)で、alias を表示できる。
多くのLinux コマンドのalias も、指定されている
gal | where-object {$_.Definition -match "remove-item"}
# Remove-Item のalias は、del, erase, rd, ri, rm, rmdir
gal | where-object {$_.Definition -match "copy-item"}
# Copy-Item のalias は、copy, cp, cpi
gal -name ls
# ls -> Get-ChildItem
gal -name echo
# echo -> Write-Output
430デフォルトの名無しさん
2019/07/31(水) 16:37:25.52ID:kGX3Rh8Y431デフォルトの名無しさん
2019/07/31(水) 22:49:22.63ID:FZL3ewwl >>412
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
432デフォルトの名無しさん
2019/07/31(水) 23:18:58.96ID:kGX3Rh8Y boshがビルドできずに諦めたw
433デフォルトの名無しさん
2019/07/31(水) 23:25:31.28ID:8xUIRaAC434デフォルトの名無しさん
2019/07/31(水) 23:39:26.64ID:8xUIRaAC おや?最新版、2019-07-22版でビルド失敗した。
なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
https://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/bosh/README.html
なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
https://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/bosh/README.html
435デフォルトの名無しさん
2019/07/31(水) 23:57:18.53ID:8xUIRaAC 2019-06-13までは普通にビルドできるね
2019-07-15からビルドに失敗するようになってる
2019-07-15からビルドに失敗するようになってる
436デフォルトの名無しさん
2019/08/01(木) 02:58:17.41ID:PmXIwIbo >>435
情報ありがとう。古いので試してみるわ。
情報ありがとう。古いので試してみるわ。
437デフォルトの名無しさん
2019/08/01(木) 11:35:33.85ID:czAE5CE0 関数の中は、set -eで止めたいけど、関数の外では(後処理をするために)止めたくないって場合が辛いわ
例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?
foo() {
set -e
echo 1
false
echo 2
}
でも呼び出し側では必ず後処理をしたいから止めたくない。
set +e
foo
echo "後処理"
これだと止まってしまうから、foo &&: とかすると
今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様?
( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、
fooがサブシェルなので、fooの中で定義した変数にアクセスできない
困った
例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?
foo() {
set -e
echo 1
false
echo 2
}
でも呼び出し側では必ず後処理をしたいから止めたくない。
set +e
foo
echo "後処理"
これだと止まってしまうから、foo &&: とかすると
今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様?
( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、
fooがサブシェルなので、fooの中で定義した変数にアクセスできない
困った
438デフォルトの名無しさん
2019/08/01(木) 12:20:40.41ID:aVYnxNEs >>431
それは犀の角が一本だからという、特にひねりのない喩え。
それは犀の角が一本だからという、特にひねりのない喩え。
439デフォルトの名無しさん
2019/08/01(木) 12:25:28.77ID:iHxbPEOX set -eはshellをexitするから当然の動作じゃない?
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか
関数の中だけなら横着せずに
false || return
しろってことじゃないかな
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか
関数の中だけなら横着せずに
false || return
しろってことじゃないかな
440デフォルトの名無しさん
2019/08/01(木) 13:07:42.24ID:lJwvTmEp 後処理だけなら、trap '後処理' ERR でやれば
根本的に -e の使い方が違うと思うけど
根本的に -e の使い方が違うと思うけど
441デフォルトの名無しさん
2019/08/01(木) 13:10:18.98ID:bR99qXsR $ dash
$ trap : ERR
trap: ERR: bad trap
$ trap : ERR
trap: ERR: bad trap
442デフォルトの名無しさん
2019/08/01(木) 13:15:37.05ID:lJwvTmEp EXIT でもいいぞ
443デフォルトの名無しさん
2019/08/01(木) 13:17:58.23ID:bR99qXsR どうやってEXITから終了せずに通常の流れに戻すの?
444デフォルトの名無しさん
2019/08/01(木) 13:19:11.98ID:lJwvTmEp なんやお前は
「後処理だけなら」って言ってるだろ
「後処理だけなら」って言ってるだろ
445デフォルトの名無しさん
2019/08/01(木) 15:30:04.66ID:WaJjQk0q SIGHUT とかのシグナル部分を書くとか?
446デフォルトの名無しさん
2019/08/01(木) 20:47:35.88ID:SQRHjrcQ func() {
return 123
}
if ! func; then
echo $?
fi
0って表示されるんだけど、どういうこと!?
return 123
}
if ! func; then
echo $?
fi
0って表示されるんだけど、どういうこと!?
447デフォルトの名無しさん
2019/08/01(木) 21:31:03.39ID:2c4IvXw2 >>446
戻り値123を!しているから0になっただけでは
戻り値123を!しているから0になっただけでは
448デフォルトの名無しさん
2019/08/01(木) 21:33:30.40ID:SQRHjrcQ こう書けってことか?
面倒くさいな
if func; then
:
else
echo $?
fi
面倒くさいな
if func; then
:
else
echo $?
fi
449デフォルトの名無しさん
2019/08/01(木) 22:05:20.92ID:Ye1sT2dv func || echo $? でいいんじゃね
450デフォルトの名無しさん
2019/08/01(木) 22:10:56.38ID:SQRHjrcQ 実際にはecho $?以外にもすることがあるから
451デフォルトの名無しさん
2019/08/01(木) 22:27:36.45ID:Ye1sT2dv んじゃ、
func || { echo $?; ... ; }
とか。
func || { echo $?; ... ; }
とか。
452デフォルトの名無しさん
2019/08/02(金) 02:34:53.77ID:hQ+yEyXN Cじゃないから終了コードをそんな風に使わないほうが良い気がする…
あくまで「気がする」だけだけど
あくまで「気がする」だけだけど
453デフォルトの名無しさん
2019/08/02(金) 02:59:49.78ID:O3iYpUQI 値が 0 とそれ以外だけではなく、
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
454デフォルトの名無しさん
2019/08/02(金) 03:02:36.73ID:O3iYpUQI ああ、そんな風 = 返り値が勝手に暗黙的に変わる変わらないってことかな?
だったらほぼ同意
だったらほぼ同意
455デフォルトの名無しさん
2019/08/02(金) 03:40:21.45ID:hQ+yEyXN456デフォルトの名無しさん
2019/08/02(金) 03:54:22.19ID:O3iYpUQI まあ元レスの人がどういう使い方をしたいのかわからんけど、そういう感じ
457デフォルトの名無しさん
2019/08/02(金) 07:48:45.01ID:hQ+yEyXN bcコマンドで階乗計算をしたくてコードを書いてるんだけど↓
n = 2
define f(n) {
f = 1
if (n == 0) { return(f) } /* 0! := 1 */
f = n * f(n - 1)
return(f)
}
"0! = "; f(0)
"1! = "; f(1)
"2! = "; f(2)
"5! = "; f(5)
多分これでいい筈なんだけどreturn式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
n = 2
define f(n) {
f = 1
if (n == 0) { return(f) } /* 0! := 1 */
f = n * f(n - 1)
return(f)
}
"0! = "; f(0)
"1! = "; f(1)
"2! = "; f(2)
"5! = "; f(5)
多分これでいい筈なんだけどreturn式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
458デフォルトの名無しさん
2019/08/02(金) 07:49:38.54ID:hQ+yEyXN ごめん一行目のn=2は無視って。
459デフォルトの名無しさん
2019/08/02(金) 08:02:59.58ID:XJV5qmce define f(n) {
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}
とか( n < 0 の場合、無限ループになるけど)
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}
とか( n < 0 の場合、無限ループになるけど)
460デフォルトの名無しさん
2019/08/02(金) 08:15:06.73ID:hQ+yEyXN >>459
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
461デフォルトの名無しさん
2019/08/02(金) 08:42:59.37ID:dUmy9lW0 elseはGNU拡張
else使えないならこうするしかない
define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
else使えないならこうするしかない
define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国・ロシア両軍の爆撃機が東京方面へ向かう「異例のルート」を共同飛行…核も搭載可能、連携して威嚇か [ぐれ★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★8 [蚤の市★]
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★3 [蚤の市★]
- 京都のホテル大幅値下げ 訪日中国人客、年1000万人目前で急ブレーキ [蚤の市★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★3 [蚤の市★]
- 【福岡】「50歳くらいの男性が倒れている」血を吐いた状態で歩道に倒れている女性見つかる 女性はその後死亡 事件と事故の両面で捜査 [ぐれ★]
- 議員定数削減法案、廃案へwmwmwmmwmwmwmw [834922174]
- 【悲報】高市首相「閣僚時代は怖くて政治資金パーティーを企画できなかった」⇒やってました [115996789]
- 【悲報】高市早苗、天皇末裔説wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww [904880432]
- 日本人、株高により消費マインドが旺盛になる!今日の買い物は明日の株高で実質ゼロ円! [782460143]
- 保育士、勤務する保育園のお着替えタイムを撮影し逮捕。レッサーパンダ並みの知能しかなさそう [389326466]
- 【悲報】高齢者、マルチコピー機で自分の逮捕状を印刷してしまう [394133584]
