シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
前スレ シェルスクリプト総合 その26
https://mevius.5ch.net/test/read.cgi/unix/1489979246/
探検
シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
2018/05/03(木) 17:54:23.25
2018/06/13(水) 02:31:02.70
>>571
入力側のリダイレクトって読みにくいので、自分もcatで書くかも
入力側のリダイレクトって読みにくいので、自分もcatで書くかも
2018/06/13(水) 03:18:10.80
2018/06/13(水) 03:20:58.92
お前じゃないよ自意識過剰
2018/06/13(水) 05:05:47.59
2018/06/13(水) 05:23:49.94
なんで俺が短く書いたのに、わざわざ冗長なコード書くかね?
しかも三項演算子を使ってもっと短くかけるし
$(((0 < a)?a:a * -1))
$((a>0?a:-a))
$((${a#-}))
${a#-}
しかも三項演算子を使ってもっと短くかけるし
$(((0 < a)?a:a * -1))
$((a>0?a:-a))
$((${a#-}))
${a#-}
2018/06/13(水) 06:09:33.52
>>581
おまえのコードは本質的じゃない
彼が望むのは「絶対値」であって「マイナスを除いたもの」ではない
OK?
分かったらひっこんでろ低能
もしこれに反論があったら「分かってない」ことになるからな?
おまえのコードは本質的じゃない
彼が望むのは「絶対値」であって「マイナスを除いたもの」ではない
OK?
分かったらひっこんでろ低能
もしこれに反論があったら「分かってない」ことになるからな?
2018/06/13(水) 06:26:16.58
2018/06/13(水) 06:48:30.93
なんで阿呆が二人に増えるんだよ
2018/06/13(水) 08:16:13.42
もう消えろお前ら
このスレに相応しくない
なんだよ最近のこのスレの雰囲気最悪じゃねーか
長文ダラダラ返信長々と最後にレスしたほうが勝ちみたいな古い争いしやがってからに
このスレに相応しくない
なんだよ最近のこのスレの雰囲気最悪じゃねーか
長文ダラダラ返信長々と最後にレスしたほうが勝ちみたいな古い争いしやがってからに
2018/06/13(水) 08:17:03.30
ヒント:一人二役
2018/06/13(水) 08:17:43.72
>>577
簡潔に書きたいというお題じゃなかったのか
簡潔に書きたいというお題じゃなかったのか
2018/06/13(水) 08:31:11.05
2018/06/13(水) 08:38:00.62
いや読みにくいって話であってだな
2018/06/13(水) 08:45:03.32
>>577
そりゃあんたの頭のレベルが低いからだと思うよ
そりゃあんたの頭のレベルが低いからだと思うよ
2018/06/13(水) 08:58:22.24
>583の脳内では全く論がない噛みつくだけの行為も反「論」になるらしい
これもう日本語が分かってないってレベルじゃないな
ただの小学生だわ
これもう日本語が分かってないってレベルじゃないな
ただの小学生だわ
2018/06/13(水) 09:13:46.26
小学生なら簡単に構ってちゃんになりそうなのはわかるな。もう構うなw
2018/06/13(水) 09:49:23.22
GNU grep なら
$ grep -Po '^.+?(?=:.+:/bin/bash$)' /etc/passwd
$ grep -Po '^.+?(?=:.+:/bin/bash$)' /etc/passwd
2018/06/13(水) 09:56:16.86
2018/06/13(水) 10:00:11.88
さいごにレスしたぼくがしょうりなんだ!
2018/06/13(水) 10:17:30.52
2018/06/13(水) 10:21:55.43
なんにでもレスするやつ
2018/06/13(水) 10:56:37.40
レスしなきゃ負けると信じてるみたいだからしょうがないね
2018/06/13(水) 11:34:13.17
$ cat <<. <<.
1AAA
.
2BBB
.
とやると
2BBB
とだけ出力されるんだけど、これどういう理屈か分かる?
標準入力ってヒアドキュメントでさえ上書きされる仕様なの?
1AAA
.
2BBB
.
とやると
2BBB
とだけ出力されるんだけど、これどういう理屈か分かる?
標準入力ってヒアドキュメントでさえ上書きされる仕様なの?
2018/06/13(水) 11:42:05.35
strace で見ると 2BBB だけ read してるな(1AAA は無視)。
2018/06/13(水) 12:01:06.03
2018/06/13(水) 12:22:00.85
>>595
0x03e8 ばんさえとれればあなたのしょうりです。
0x03e8 ばんさえとれればあなたのしょうりです。
2018/06/13(水) 16:23:41.49
2018/06/13(水) 16:51:47.47
リダイレクトは引数じゃないからね
実質これと同じわけだし
exec </proc/loadavg
exec </proc/uptime
cat
実質これと同じわけだし
exec </proc/loadavg
exec </proc/uptime
cat
2018/06/13(水) 17:56:57.18
>>604
なるほど、納得
なるほど、納得
2018/06/13(水) 18:05:22.98
2018/06/13(水) 18:44:51.04
なんか嫌らしい感じ
2018/06/14(木) 18:54:32.62
コロンを含むディレクトリを$PATHに登録した場合ってどういう挙動になるんだろう
2018/06/14(木) 20:11:28.93
コロンがセパレータなのでそこで分かれる
2018/06/14(木) 20:52:33.17
findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
どうにかなりませんかね。
今のところ/dev/nullに標準エラー出力を捨てることで解決してるんですけども。
find . -exec basename \{\} \; | head
↑これで再現するはずです。
解決するときはできればPOSIXの範囲でやりたいです。findのGNU拡張で解決できるならそれでもいいんですが
メインPCがOS Xなので、最低でもBSD拡張、さらに言えばPOSIXに限定してほしいです すいません。
どうにかなりませんかね。
今のところ/dev/nullに標準エラー出力を捨てることで解決してるんですけども。
find . -exec basename \{\} \; | head
↑これで再現するはずです。
解決するときはできればPOSIXの範囲でやりたいです。findのGNU拡張で解決できるならそれでもいいんですが
メインPCがOS Xなので、最低でもBSD拡張、さらに言えばPOSIXに限定してほしいです すいません。
2018/06/14(木) 21:25:25.31
macOSだが再現しないなあ
2018/06/14(木) 22:13:02.03
FreeBSDは再現しない。
CentOSは再現した。
対策は後で考える。
CentOSは再現した。
対策は後で考える。
2018/06/14(木) 22:18:48.70
なにか最近やけに POSIX にこだわってる奴が多いが同一人物か?
2018/06/14(木) 22:31:37.92
>>613
単純にPOSIXの価値というかシェルスクリプト全体の有用性が見直されているだけでは
たとえば*BSDのスレでGNUライセンスに拘ったレスが連続するのはおかしいが
BSDライセンスを重視するスレがたくさんあっても別におかしくはないだろう
単純にPOSIXの価値というかシェルスクリプト全体の有用性が見直されているだけでは
たとえば*BSDのスレでGNUライセンスに拘ったレスが連続するのはおかしいが
BSDライセンスを重視するスレがたくさんあっても別におかしくはないだろう
2018/06/14(木) 22:32:42.05
パイプでなのでfindとhead が同時にプロセスとして存在
findが標準出力に出力するとパイプを通して/パイプとして繋がってるheadの標準入力に入力として
headが目的を達して終了=パイプが無くなる、だがしかし、findは出力を続けようとし出力しようとしたらパイプが壊れてるうううっ
普通何もしなくても、パイプが損失したらSIGPIPEが飛んできて(強制)終了するんだけど(フィルタとしてもなUNIX的な望ましいデフォルト動作)、なぜかSIGPIPE無視して続けようという謎動作?
findとheadが直接は繋がっていなくてかもしれんが。パイプの送出側がSIGPIPEを無視って謎動作なのは変わらないかな
findが標準出力に出力するとパイプを通して/パイプとして繋がってるheadの標準入力に入力として
headが目的を達して終了=パイプが無くなる、だがしかし、findは出力を続けようとし出力しようとしたらパイプが壊れてるうううっ
普通何もしなくても、パイプが損失したらSIGPIPEが飛んできて(強制)終了するんだけど(フィルタとしてもなUNIX的な望ましいデフォルト動作)、なぜかSIGPIPE無視して続けようという謎動作?
findとheadが直接は繋がっていなくてかもしれんが。パイプの送出側がSIGPIPEを無視って謎動作なのは変わらないかな
2018/06/14(木) 22:38:09.62
>>615
basenameが標準出力につながってるだけだから、findはwriteしないのでSIGPIPEを受け取らないよ。
basenameが事故死したのをfindが報告してるだけ。
というわけで、basenameが事故死したらfindを続けるのをやめるようにしてみた。
この方が無駄にbasenameを続けるよりよかろう。
find /var \( -exec basename {} \; -o -quit \) | head
ただし、最初の事故死についてだけはfindがおせっかいに報告してしまう。
あとはまかせた。
basenameが標準出力につながってるだけだから、findはwriteしないのでSIGPIPEを受け取らないよ。
basenameが事故死したのをfindが報告してるだけ。
というわけで、basenameが事故死したらfindを続けるのをやめるようにしてみた。
この方が無駄にbasenameを続けるよりよかろう。
find /var \( -exec basename {} \; -o -quit \) | head
ただし、最初の事故死についてだけはfindがおせっかいに報告してしまう。
あとはまかせた。
2018/06/14(木) 22:41:30.04
>>616
そのへんが実装によりちょっと違うってとこなのかなあ。出る出ないは
そのへんが実装によりちょっと違うってとこなのかなあ。出る出ないは
2018/06/14(木) 22:48:28.09
>>613
自分側で「なにか違って」動かなかったらめんどくさいってだけじゃないの、単に
自分側で「なにか違って」動かなかったらめんどくさいってだけじゃないの、単に
2018/06/14(木) 22:49:53.08
2018/06/14(木) 22:50:38.44
CentOS$ strings /bin/find | grep -i signal
signal
%s terminated by signal %d
FreeBSD$ strings /usr/bin/find | grep -i signal
なんもなし
以上、findのおせっかい度の差。
signal
%s terminated by signal %d
FreeBSD$ strings /usr/bin/find | grep -i signal
なんもなし
以上、findのおせっかい度の差。
621619
2018/06/14(木) 22:51:53.48 すまん間違えて送信しちゃった
$ find /etc -exec sh -c 'basename {}' \; | head
これでどうだろう。
-quitオプションはPOSIXの範疇ではないけどこれはPOSIXに準拠してる
ちなみに>>610のコマンドラインはDebian GNU/Linuxのfind 4.7で再現した。
$ find /etc -exec sh -c 'basename {}' \; | head
これでどうだろう。
-quitオプションはPOSIXの範疇ではないけどこれはPOSIXに準拠してる
ちなみに>>610のコマンドラインはDebian GNU/Linuxのfind 4.7で再現した。
2018/06/14(木) 22:55:42.54
2018/06/14(木) 22:57:07.67
>>621
ん? それSIGPIPEは回避できるけど別の問題が発生しない?
「basename: 余分な演算子 XXX」←みたいに怒られるんだが
あと
$ find /etc -exec sh -c 'echo {}' \; | head
↑これをやるとやっぱりSIGPIPEが出されるようだ。
ん? それSIGPIPEは回避できるけど別の問題が発生しない?
「basename: 余分な演算子 XXX」←みたいに怒られるんだが
あと
$ find /etc -exec sh -c 'echo {}' \; | head
↑これをやるとやっぱりSIGPIPEが出されるようだ。
2018/06/15(金) 00:01:24.90
2018/06/15(金) 00:03:14.56
>>610
>findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
この動作は、POSIX的にはどうなの?
まずいというならPOSIX的にどうまずいの?
>findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
この動作は、POSIX的にはどうなの?
まずいというならPOSIX的にどうまずいの?
2018/06/15(金) 00:08:14.14
find . -exec basename \{\} \; | { head; cat >/dev/null; }
2018/06/15(金) 00:14:45.23
>>626
どういう仕組みなん?
どういう仕組みなん?
2018/06/15(金) 00:39:45.42
-execにこだわりがないのであれば、
find . -print0 | xargs -0 -L 1 basename | head
今度はxargsがお節介メッセージ出すけど、findはheadが終了したら終了する
find . -print0 | xargs -0 -L 1 basename | head
今度はxargsがお節介メッセージ出すけど、findはheadが終了したら終了する
2018/06/15(金) 01:01:37.95
xargs(1)に-0オプションはない(POSIX厨)
2018/06/15(金) 02:22:41.09
findにも-print0は無いけどな。BSDにもあるからいいんじゃね
2018/06/15(金) 08:25:40.13
find . -print | xargs -n1 basename 2>/dev/null | head
2018/06/15(金) 20:58:34.50
execオプションはやめといたほうがいいね
2018/06/15(金) 21:35:58.85
元々何が気に入らなかったのかイマイチわからない
2018/06/15(金) 22:35:17.99
POSIX的に気に入らない
2018/06/15(金) 23:11:38.57
POSIX POSIXうっせー
2018/06/15(金) 23:13:05.02
2018/06/16(土) 00:18:50.65
findutilsのソース取って来てあのメッセージ出ないようにパッチして使っちゃえよもう
http://git.savannah.gnu.org/cgit/findutils.git/tree/find/exec.c?h=v4.6.0#n354
http://git.savannah.gnu.org/cgit/findutils.git/tree/find/exec.c?h=v4.6.0#n354
2018/06/16(土) 00:33:50.14
>>616
find . -exec sh -c 'trap "exit" pipe; basename {}' \; -o -quit | head
find . -exec sh -c 'trap "exit" pipe; basename {}' \; -o -quit | head
2018/06/16(土) 01:07:40.99
>>638
試してないけど、trapせずにbasenameのあとにexitするだけでだめなん?
試してないけど、trapせずにbasenameのあとにexitするだけでだめなん?
2018/06/16(土) 08:33:03.61
find /etc -exec basename \{\} \; |& head
これでエラーも出ず余計な出力も引っ掛らなかったんだけど
理屈が分からん
|& は標準出力と標準エラー出力両方を通すはずなので
SIGPIPEのエラーが出力されるはずだがgrepしても見当らない
これでエラーも出ず余計な出力も引っ掛らなかったんだけど
理屈が分からん
|& は標準出力と標準エラー出力両方を通すはずなので
SIGPIPEのエラーが出力されるはずだがgrepしても見当らない
2018/06/16(土) 10:03:37.06
find自身がSIGPIPEで終了してんじゃない
実行時間も短くなってるし
実行時間も短くなってるし
2018/06/16(土) 10:39:12.35
Linux なら strace で見ると分かる
$ strace -f bash -c 'find /etc -exec basename \{\} \; |& head'
$ strace -f bash -c 'find /etc -exec basename \{\} \; |& head'
2018/06/16(土) 11:10:29.82
stderrが(標準出力)のパイプになりの、そのパイプが無くなり、find自身がエラーメッセージをそれに書き込もうとしてSIGPIPEを受けるってとこか
find . -exec basename {} \; -o -print | head
としても同じように終わるってとこで
find . -exec basename {} \; -o -print | head
としても同じように終わるってとこで
2018/06/16(土) 12:55:30.00
>>644
ほほう
ほほう
2018/06/16(土) 13:02:42.26
2018/06/16(土) 13:15:44.53
2018/06/16(土) 13:16:47.78
2018/06/16(土) 13:26:10.67
ああ、|& は元々はzshのなのか(?)
macOS Sierra標準のzshでは/でも、>>640のままで特に何も問題なく終わった
macOS Sierra標準のzshでは/でも、>>640のままで特に何も問題なく終わった
2018/06/16(土) 14:10:29.68
>>649
|&はcsh由来。zshはパクっただけ。
|&はcsh由来。zshはパクっただけ。
2018/06/16(土) 17:20:45.43
|&はPOSIXなの?
2018/06/16(土) 17:32:28.45
やかましいわっw、おばかさん
2018/06/16(土) 17:58:54.17
それはPOSIXですか?POSIXじゃないのですか?
2018/06/16(土) 18:00:34.28
ところで俺のPOSIXを見てくれ。こいつをどう思う?
2018/06/16(土) 18:14:03.11
すごく、標準的です
2018/06/16(土) 18:39:24.01
Is it POSIX?
2018/06/16(土) 18:58:44.20
No, it is Apple
2018/06/16(土) 19:58:16.75
まあPOSIXじゃないので質問者の要請は満たしてないよね
俺が提案するとしたらexecは使わず
find . | xargs -I @ basename @ | head
↑これ。
俺が提案するとしたらexecは使わず
find . | xargs -I @ basename @ | head
↑これ。
2018/06/16(土) 20:06:12.48
それじゃあかんだろ。xargsのオプションが足りない
2018/06/16(土) 20:09:55.36
いいのか。すまん
2018/06/16(土) 20:37:42.14
俺がやるなら xargs -I には {} を 指定するがな
@というのは見たことがない 社内規約かなにかかな?
@というのは見たことがない 社内規約かなにかかな?
2018/06/16(土) 20:51:48.06
>>656-657
定冠詞がないよ
定冠詞がないよ
2018/06/16(土) 20:56:44.95
この問題って本質的には、 find は /etc の下の全部のファイル(10以上)を返すが、
head は 10行で打ち切ってしまうという矛盾にある。
そこは目をつぶるって方針なんだから、最初に書いてあったstderrを捨てるって
方法で正しいと思うよ
head は 10行で打ち切ってしまうという矛盾にある。
そこは目をつぶるって方針なんだから、最初に書いてあったstderrを捨てるって
方法で正しいと思うよ
2018/06/16(土) 20:59:20.95
2018/06/16(土) 21:30:02.51
2018/06/16(土) 22:02:52.02
>>662
マジレスアッポー
マジレスアッポー
2018/06/16(土) 23:19:14.74
コマンドの重複を数える(つまり$PATHに登録され実行可能なファイルの重複を列挙する)一番短い方法をってなんでしょう。ただし確実に動作しかつ可搬であることが条件です。
僕が考えたのは
$ echo $PATH | tr ':' '\n' | xargs -I @ find @ \( -type f -a -perm -+x \) -exec basename \{\} \; | sort | uniq -c
です。
僕が考えたのは
$ echo $PATH | tr ':' '\n' | xargs -I @ find @ \( -type f -a -perm -+x \) -exec basename \{\} \; | sort | uniq -c
です。
2018/06/16(土) 23:24:18.70
basenameにしたらファイル名じゃなくなるじゃん
2018/06/16(土) 23:36:17.54
2018/06/17(日) 04:18:06.91
パスの中に空白が入ってる or PATHの中身が多すぎたらおそらくアウト
( IFS=:; find $PATH -type f -a -perm -+x ) | sed 's|.*/||g' | sort | uniq -c
( IFS=:; for i in $PATH; do find "$i" -type f -a -perm -+x; done ) | sed 's|.*/||g' | sort | uniq -c
( IFS=:; find $PATH -type f -a -perm -+x ) | sed 's|.*/||g' | sort | uniq -c
( IFS=:; for i in $PATH; do find "$i" -type f -a -perm -+x; done ) | sed 's|.*/||g' | sort | uniq -c
2018/06/17(日) 08:19:10.40
できればsedでやりたいことなんですが
aaa
<<
bbb
>>
もしくは
aaa
<<bbb>>
というようなファイルがあったとしてaaaの次行から「>>」を含む行までを読み出したいです。
(aaaが存在する行はすでに具体的な数値で判明しています; ここでは42行目とします)
特に二番目の場合には sed -n -e '43,/>>/p'とやると43行目に「>>」があるのに見つけてくれません。
なにか手助けをおねがいします。
aaa
<<
bbb
>>
もしくは
aaa
<<bbb>>
というようなファイルがあったとしてaaaの次行から「>>」を含む行までを読み出したいです。
(aaaが存在する行はすでに具体的な数値で判明しています; ここでは42行目とします)
特に二番目の場合には sed -n -e '43,/>>/p'とやると43行目に「>>」があるのに見つけてくれません。
なにか手助けをおねがいします。
672名無しさん@お腹いっぱい。
2018/06/17(日) 09:24:18.61 >>671
sed -e '42,/>>/!d' -e 42d
sed -e '42,/>>/!d' -e 42d
2018/06/17(日) 12:39:57.71
あれんじ
sed -e '43,$!d;/>>/q'
sed -e '43,$!d;/>>/q'
2018/06/17(日) 14:39:23.57
2018/06/17(日) 14:43:41.30
言いたいことがわからない
2018/06/17(日) 16:46:05.17
言っても無駄なんだろうが、そんなファイルを処理しようってのが間違ってると思う
2018/06/17(日) 19:18:43.97
>>676
処理したい時はどうすればいいですかね。
処理したい時はどうすればいいですかね。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】2026年北中米W杯の組み合わせが決定! 日本代表はオランダ、チュニジア、欧州プレーオフB勝者と同組で激突★3 [冬月記者★]
- 高市首相が漫画セリフ引用し《いいから黙って全部俺に投資しろ!》 金融会合での“進撃のサナエ”に海外ドン引き [バイト歴50年★]
- 渡邊渚「性を売ってるくせに」批判に反論 幻滅「これが日本の現状だよなー」「『渾身の下着!』というような意味でやってない」★3 [Ailuropoda melanoleuca★]
- 【鮭】20代女性の車のドアノブに体液、不同意わいせつ未遂の容疑で広島市安佐北区の30歳無職男を逮捕 [nita★]
- 鈴木農相、地元JAから借入金 おこめ券巡り利害誘導との批判も★2 [安倍聖帝★]
- 【芸能】批判招いた「ドラゴンボールストア」イラスト問題に原作編集者マシリト氏が厳しく言及 問題点指摘 [湛然★]
- 【NHK他】FIFAワールドカップ2026 はじまらない組み合わせ抽選★4
- 競輪実況★1620
- とらせんIP ★2
- ハム専 サヨナラ石井
- こいせん 全レス転載禁止
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap611
- 3 人 寄 ら ば
- みたらし団子嫌い
- 海外の識者「日銀は日本が破綻するかどうかを決めているのではない。彼らは“いつ破綻するか”を決めている」 [268718286]
- 食材となるものはな、罪があったから食材にされるんだよ
- 【高市悲報】プリキュア「いま私たちは環境問題に関心があるの」 プリオタ「ギェェェェェ思想が強すぎる!!」大炎上🔥 [762037879]
- 今はもう動かないおじいさんにトドメ~
