シェルスクリプト総合 その22
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2013/11/01(金) 07:58:50.52□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
0205名無しさん@お腹いっぱい。
2014/02/08(土) 20:58:46.89デフォで入ってないから
0206名無しさん@お腹いっぱい。
2014/02/08(土) 21:21:03.42じゃぁ今思い付いたけど、ポート番号なんかのように数が大きい場合はどうするの?
49152–65535が自由に使えるけど、以下の場合は{$NUM}はどうするの?
while (((i = RANDOM % {$NUM}) >= 16384)); do :; done; echo $((i + 49152))
16384は2^nだけど、となるとi = RANDOM % 16384のままでいいの?
0207名無しさん@お腹いっぱい。
2014/02/08(土) 21:22:59.32echo $(( (RANDOM % 16384) + 49152 ))
のままでいいと言うことになるのかな?
0208名無しさん@お腹いっぱい。
2014/02/08(土) 21:50:12.572^nなら一様乱数になるんだから
0209名無しさん@お腹いっぱい。
2014/02/08(土) 22:09:57.81command > log.log
とひとつづつ書かないとだめなのでしょうか。
0210名無しさん@お腹いっぱい。
2014/02/08(土) 22:15:11.27exec 1> log.txt
exec 2>&1
echo hoge
echo fuga >&2
ファイルにも標準出力にも出したい時は
exec 1> >(tee log.txt)
0211名無しさん@お腹いっぱい。
2014/02/09(日) 16:46:34.97スクリプト内のコマンド実行結果すべての標準出力/標準エラー出力を
まとめて同じログに送っていいなら、スクリプトの結果をリダイレクトすればよろし。
$ script.sh > log.log 2>&1
細かく制御したいなら、>>210 がよろし。
0212名無しさん@お腹いっぱい。
2014/02/11(火) 11:30:01.58>exec 2>&1
なんで2行に分ける? basherは頭が悪いな
0213名無しさん@お腹いっぱい。
2014/02/11(火) 18:09:26.52こうか?
0214名無しさん@お腹いっぱい。
2014/02/11(火) 18:14:28.58これかね 引数の順番を逆にすると駄目
0215名無しさん@お腹いっぱい。
2014/02/12(水) 01:12:42.760216名無しさん@お腹いっぱい。
2014/02/12(水) 01:20:04.910217名無しさん@お腹いっぱい。
2014/02/12(水) 06:08:29.880218名無しさん@お腹いっぱい。
2014/02/12(水) 07:25:04.970219名無しさん@お腹いっぱい。
2014/02/12(水) 08:43:11.540220名無しさん@お腹いっぱい。
2014/02/12(水) 16:58:41.44> #!/bin/bash
こういうおバカはひとくくりでかまわない
0221名無しさん@お腹いっぱい。
2014/02/12(水) 17:30:14.30>>210 の最終行で named pipeの文法使ってるから #!/bin/bashにする必要がある。
#!/bin/sh で起動すると(たとえ実体はbashでも) sh互換モードになって named pipeの文法がエラーになる。
0222名無しさん@お腹いっぱい。
2014/02/12(水) 18:31:03.25bash固有機能は使うなよ
ということを言いたいのでは?
0223名無しさん@お腹いっぱい。
2014/02/12(水) 18:46:49.62使ってもいいじゃん、と言いたいのでは。
0224名無しさん@お腹いっぱい。
2014/02/12(水) 19:07:56.04・・・きっともう、シェルスクリプトはshやbashで書くtcshユーザも肩身が狭いんだろうな・・・
0225名無しさん@お腹いっぱい。
2014/02/12(水) 20:22:10.380226名無しさん@お腹いっぱい。
2014/02/12(水) 20:26:12.200227名無しさん@お腹いっぱい。
2014/02/12(水) 21:03:28.970228名無しさん@お腹いっぱい。
2014/02/12(水) 21:51:15.94もはやtcshユーザなんてどうしようもない偏執狂しか居ないはずだが
0229名無しさん@お腹いっぱい。
2014/02/12(水) 22:03:29.03絶対使いたくないわ
0230名無しさん@お腹いっぱい。
2014/02/12(水) 22:10:04.50ホントスンマセン。by tcshユーザー
スクリプトは勿論Bourneシェルで書くんだけどねえ。
0231名無しさん@お腹いっぱい。
2014/02/12(水) 22:10:16.140232名無しさん@お腹いっぱい。
2014/02/12(水) 22:16:18.78それならいいんじゃね。
スクリプトのスレなんだから。
0233名無しさん@お腹いっぱい。
2014/02/12(水) 22:26:25.01あんがと。
企業で稀に見かけるcshスクリプト書きって、偏執狂というより
単なる物知らずって気がするよ。
bash登場以前、newcshとかあった頃は、対話的シェルはcsh系が
主流で、よく分かってない人の中には、なんとなくスクリプトもcshで
書くって人がいた(俺はその頃からスクリプトはBourneシェルだったけど)。
で、その頃に書かれたスクリプトを秘伝のたれみたいに直し直し
使ってるのを2000年頃に見て驚いたことがある。
俺のまわりでは、そういうのもさすがに滅んだけど。
0234名無しさん@お腹いっぱい。
2014/02/12(水) 22:39:05.82企業とか大学とかでもまだ見るよ、代々cshスクリプトをなおすところ。
基本 csh しかわからない人しかいないから sh に移行できない/しても指導できる人が居ない。
0236名無しさん@お腹いっぱい。
2014/02/12(水) 23:13:14.98ログインシェルもcsh系だった気がする
今となってはcshしかわからない人なんていないでしょ
わざわざコストをかけて書き直すほどのものじゃないって
そういやFreeBSD鯖のログインシェルはtcshのままにしてるな
デフォルトから変更するほどシェルに思い入れが無いだけかも
0237名無しさん@お腹いっぱい。
2014/02/13(木) 00:09:22.64そのまま実行する方法があったら教えてください。
吐き出すスクリプトは具体的にはffmpegを複数行実行するものです。
bash -s とかやってみたのですが、うまくいきませんでした。
0238名無しさん@お腹いっぱい。
2014/02/13(木) 03:59:27.39echo ls | bash -s
とかで動くけど? (この場合は -s は省略可)
0239名無しさん@お腹いっぱい。
2014/02/13(木) 07:46:40.27>>>210 の最終行で named pipeの文法使ってるから #!/bin/bashにする必要がある。
「named pipeの文法」ってなんだよ
これだからbasherは… w
0240名無しさん@お腹いっぱい。
2014/02/13(木) 08:29:17.43/dev/nullにリダイレクトしては駄目なの?
0241名無しさん@お腹いっぱい。
2014/02/13(木) 11:03:48.37eval `echo ls`
0242237
2014/02/13(木) 12:55:37.44そのやり方ですと、1行目で実行したffmpegが2行目以降を
キー入力として受け取ってしまうようなんです。。。
一度リダイレクトでファイルに出して、
bash tmp.sh
みたいにすれば問題なく逐次実行されます。
よく分かってないのですが、標準入力とttyの関係とかでしょうか
0243名無しさん@お腹いっぱい。
2014/02/13(木) 13:17:07.98ffmpeg </dev/tty
みたいにして、キー入力を端末に強制する方法と、
bash <(スクリプト)
みたいにして標準入力を使わずに済ます手がある。
だが、最初にキー入力の問題だと、ちゃんと書くように!w
0244237
2014/02/13(木) 14:38:09.52どちらの方法も完全にうまくいきました、ありがとうございました!
後者のやり方がなぜうまくいくのかまだピンときていませんが、
いろいろ調べてみようと思います。
あと最初からキチンと書かなくてすみませんでした
0245名無しさん@お腹いっぱい。
2014/02/13(木) 16:42:41.00プロセス置換でググってみな
0246237
2014/02/13(木) 17:03:46.98なるほど、こういう機能ってzshにある感じはしていたのですが、
bashにもあるんですね!
bashの ( ) はサブシェルだと思っていました…
0247名無しさん@お腹いっぱい。
2014/02/13(木) 22:47:07.79少しずつ入れてんのかね
0248名無しさん@お腹いっぱい。
2014/02/13(木) 22:49:59.70個人的には {1..30}が入ったのは地味に大きい。
それでもzsh使ってるけど。
0249名無しさん@お腹いっぱい。
2014/02/13(木) 23:12:09.870250名無しさん@お腹いっぱい。
2014/02/13(木) 23:16:17.55バッチ処理させるスクリプトとしてならbashの方が使いやすい
というかzshは機能多すぎドキュメント多すぎで訳ワカメ
0251名無しさん@お腹いっぱい。
2014/02/13(木) 23:39:34.45どの機能がbashがサポートしてるか調べるのめんどい
0252名無しさん@お腹いっぱい。
2014/02/14(金) 00:11:56.32かといって #!/bin/zsh -f にするとめちゃ使いづらいし・・・痛し痒し
0253名無しさん@お腹いっぱい。
2014/02/14(金) 03:53:13.33#!/bin/zsh
echo hoge >file1 >file2 >/dev/stdout
↑これだけで固まるw
0254名無しさん@お腹いっぱい。
2014/02/14(金) 07:49:53.200255名無しさん@お腹いっぱい。
2014/02/14(金) 07:55:46.01PROMPT_COMMANDを仕込むことで実現してる人はいるよ。
http://iandeth.dyndns.org/mt/ian/archives/000651.html
でも標準機能としてほしいのは同意。
0256名無しさん@お腹いっぱい。
2014/02/14(金) 10:23:51.87ConnectBot、メモリ食い杉だ。他のシェル端末の方がいい。
0257名無しさん@お腹いっぱい。
2014/02/14(金) 12:03:01.25それバグじゃなくね。
0258名無しさん@お腹いっぱい。
2014/02/14(金) 14:58:36.750259名無しさん@お腹いっぱい。
2014/02/14(金) 15:23:01.77オススメってある?
0260名無しさん@お腹いっぱい。
2014/02/14(金) 23:52:33.86何これ誰か解説して
0261名無しさん@お腹いっぱい。
2014/02/15(土) 00:24:21.360262名無しさん@お腹いっぱい。
2014/02/17(月) 00:17:17.980263名無しさん@お腹いっぱい。
2014/02/17(月) 16:13:15.320264名無しさん@お腹いっぱい。
2014/02/17(月) 20:52:24.810265名無しさん@お腹いっぱい。
2014/02/19(水) 16:43:38.09. ./hoge.sh fuga.txt
みたいに引数渡して起動してるシェルを、引数変えて再起動するにはどうすればいいですか?
シェル内で
. ./hoge.sh $fuga
みたいに変数いれたらダメで、
. ./hoge.sh fuga2.txt
みたいに指定したら行けます。
0266名無しさん@お腹いっぱい。
2014/02/19(水) 17:15:31.060267名無しさん@お腹いっぱい。
2014/02/19(水) 17:18:00.48その $fuga というのがスクリプト起動時にはまだ値がないんだろ? それなら駄目。
hoge.sh の中で fugaに値が代入されるとしても、それを起動時に指定することはできない。
0268名無しさん@お腹いっぱい。
2014/02/19(水) 17:29:23.50同じ構成の画面を、設定ファイルを指定して使い回すためです
>>267
ありがとうございます。
テキストにでも書き出して、そこから読み直してみます。
0269名無しさん@お腹いっぱい。
2014/02/19(水) 17:49:40.79だから、なぜ普通に起動せずにsourceで実行するのかを聞いてるんだが。
0270名無しさん@お腹いっぱい。
2014/02/19(水) 18:00:57.53init.dとかのスクリプト見て真似てみたら。
関数にして呼び出す。
0271名無しさん@お腹いっぱい。
2014/02/19(水) 22:59:42.02$ cat hoge.sh
echo "hoge.sh is called with $1"
if [ "$1" = "fuga.txt" ] ; then
fuga="fuga2.txt"
. ./hoge.sh $fuga
fi
$ . ./hoge.sh fuga.txt
hoge.sh is called with fuga.txt
hoge.sh is called with fuga2.txt
0272265
2014/02/20(木) 09:12:57.78どうやら変数の入れ方の様です。
fuga.txtに
trans_2=fuga2.txt
があって、
read input_key #ここで2を入力
eval input_trans='$trans_'input_key
echo $input_trans
これで
fuga2.txt
と出力されるのですが、
. ./hoge.sh $input_trans
とすると、引数を読まない感じです。
直前に
$input_trans=”fuga2.txt”
といれると動きます。
端末から直接書き込めないので、スマホで打ってるので、
読みにくくて申し訳ないです。
0273名無しさん@お腹いっぱい。
2014/02/20(木) 11:48:12.75. にはオプショナル引数は渡せない。無視される。
>>271
basherは「普通に」と言うな
0274265
2014/02/20(木) 13:03:57.32なるほど。ありがとうございます。
manはききませんでした。
cygwinなので、インストールをスキップされてるのかもしれないです。
0275名無しさん@お腹いっぱい。
2014/02/20(木) 14:55:50.29>trans_2=fuga2.txt
>があって、
もしかしてfuga.txtもsourceする?
そこに原因がある気がする
0276名無しさん@お腹いっぱい。
2014/02/20(木) 19:07:54.76でも、今は「普通=bash」だから仕方ないですよね・・・
0277名無しさん@お腹いっぱい。
2014/02/20(木) 19:23:08.95ログインシェルならtcshユーザだってそこそこ居るんだぞ
0278名無しさん@お腹いっぱい。
2014/02/20(木) 19:40:30.630279名無しさん@お腹いっぱい。
2014/02/20(木) 20:02:25.81動いているところを見たことはない
0280名無しさん@お腹いっぱい。
2014/02/20(木) 20:04:39.540281名無しさん@お腹いっぱい。
2014/02/20(木) 20:54:06.58俺 csh なんだけど…。
実体は tcsh の csh モード。
0282名無しさん@お腹いっぱい。
2014/02/20(木) 20:56:14.43何をきっかけに乗り換えるものなんだ?
俺にはまだきっかけが来ない。
0283名無しさん@お腹いっぱい。
2014/02/20(木) 21:23:05.80俺は最初に与えられたのが tcsh で、暫くそれ使ってたが、人の書いたシェルスクリプトを修正したり
しているうちに sh の文法の方が詳しい状態になったから bash に移行したわ。
部屋の模様替えみたいな気分でやってみればいいんじゃね?
0284名無しさん@お腹いっぱい。
2014/02/20(木) 21:34:22.210285名無しさん@お腹いっぱい。
2014/02/20(木) 21:41:08.58堂々巡りでもうどうでも良く
0286名無しさん@お腹いっぱい。
2014/02/20(木) 21:44:27.47しか使ってないだろうから、csh は機能が足りないと
か不便だとか言えなくてなあ。
0287名無しさん@お腹いっぱい。
2014/02/20(木) 22:02:13.110288名無しさん@お腹いっぱい。
2014/02/21(金) 00:01:47.64な?そこそこ居るだろ?
0289名無しさん@お腹いっぱい。
2014/02/21(金) 00:31:42.46自分で使う分には勝手だけど、くれぐれも後輩に広めんなよ
0290名無しさん@お腹いっぱい。
2014/02/21(金) 00:34:46.45欠点って.cshrcがcshスクリプトだから.cshrcのカスタムに拘ると死ぬくらいじゃねーの?
0291名無しさん@お腹いっぱい。
2014/02/21(金) 00:37:33.91でも、そうでないなら・・
0292名無しさん@お腹いっぱい。
2014/02/21(金) 00:39:27.040293名無しさん@お腹いっぱい。
2014/02/21(金) 00:42:49.85最後にみたcshは補間機能とかけっこう充実してた記憶が
0294名無しさん@お腹いっぱい。
2014/02/21(金) 01:03:08.94すいません、csh系のシェルについて聞いたつもりでした。
tcshとかだとできるんですかね?
0295名無しさん@お腹いっぱい。
2014/02/21(金) 04:20:50.14別ものにしてる人っていんの?ログイン後にわざわざ切り替えてんの?ありえねー
俺なんか$HOME下にビルドした最新のzshを躊躇なくログインシェルにしてるわ
0296名無しさん@お腹いっぱい。
2014/02/21(金) 08:14:31.18stderrだけをリダイレクト出来ない
0297名無しさん@お腹いっぱい。
2014/02/21(金) 08:25:11.310298名無しさん@お腹いっぱい。
2014/02/21(金) 16:10:18.18zshのログインシェルでviをたちあげcshスクリプトを書く、とかそういうことじゃないの
0299名無しさん@お腹いっぱい。
2014/02/21(金) 16:59:25.85.bashrcに/usr/bin/zshって書くべし
みたいなことをFreeBSDのマニュアルかなんかに書いてた気がする
0300名無しさん@お腹いっぱい。
2014/02/21(金) 17:07:53.800301名無しさん@お腹いっぱい。
2014/02/21(金) 17:16:01.62俺は毎日他社の違うサーバにrootアカウントで入る日々だから
ログインしたら1発目のコマンドが
# /bin/csh ; exit
だ。
元のログインシェルが何か調べもしない。
OSの素性を調べるのもそれから。
そのあと好みの環境変数等を全部手打ちして
それからOSの素性を調べてから作業に入る。
0302名無しさん@お腹いっぱい。
2014/02/21(金) 17:29:18.58あと/bin から /usr/bin に移行しつつあるし
0303名無しさん@お腹いっぱい。
2014/02/21(金) 17:37:06.32# exec /bin/csh でいーんじゃないの
0304名無しさん@お腹いっぱい。
2014/02/21(金) 17:45:24.20今どきそんなケースほぼないだろ。
■ このスレッドは過去ログ倉庫に格納されています