シェルスクリプト総合 その20
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/06/08(金) 00:35:51.19スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
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でそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その19
http://toro.2ch.net/test/read.cgi/unix/1323515200/
0002名無しさん@お腹いっぱい。
2012/06/08(金) 01:03:54.93レイヤードシェル
もしくは
シェルレイヤー
という物が存在していたらしいのですが、
どんな物だったのでしょうか?
ジョブコントロールできるらしいのですが。
0003名無しさん@お腹いっぱい。
2012/06/08(金) 02:06:15.150004名無しさん@お腹いっぱい。
2012/06/08(金) 02:15:08.82何のための板だよここwww
0005名無しさん@お腹いっぱい。
2012/06/08(金) 06:17:43.380006名無しさん@お腹いっぱい。
2012/06/08(金) 06:33:16.03A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
UNIX の勉強には向いていません。
0007名無しさん@お腹いっぱい。
2012/06/08(金) 07:20:45.00頭大丈夫か?
シェルを全く使用せずにUNIXの勉強とか、どんなアクロバットだよw
0008名無しさん@お腹いっぱい。
2012/06/08(金) 07:44:41.28GNUScreenから画面管理を引いたようなもの。
0009名無しさん@お腹いっぱい。
2012/06/08(金) 07:58:45.93つまり座学で基礎理論を学んでから出直せってこと?
0010名無しさん@お腹いっぱい。
2012/06/08(金) 09:38:32.41衣服(shell)の重ね着(layered)のことだろ。
登山なんかでは速乾性の下着から防水防風透湿のジャケットまで
機能の異なる薄手のシェルを何枚も重ねて着るのが常識。
0011名無しさん@お腹いっぱい。
2012/06/08(金) 09:49:49.84http://docstore.mik.ua/orelly/unix/unixnut/c02_191.htm
http://www.unix.com/man-page/All/1/shl/
http://cai.cs.shinshu-u.ac.jp/sugsi/Lecture/HowToUnix/3-1.html
0012名無しさん@お腹いっぱい。
2012/06/08(金) 09:55:28.150013名無しさん@お腹いっぱい。
2012/06/08(金) 16:51:20.05... なる程、shlか。知らなかった。sh -kといい、まさにトリビア級。すごい。
0015名無しさん@お腹いっぱい。
2012/06/09(土) 13:48:39.990016名無しさん@お腹いっぱい。
2012/06/09(土) 13:48:53.77素人は grep 〜 | head -n 2 | tail -n 1 なんてするところだろうな
Cで2行目取り出すツールを書くのが最速
fgetc()とかで何とかなる
0017名無しさん@お腹いっぱい。
2012/06/09(土) 13:53:34.23grep -A1
でいいじゃん。
一致した行自体も出るけど、エスパーするとむしろその方がいいと出てる。
0018名無しさん@お腹いっぱい。
2012/06/09(土) 13:57:44.31それは一致した行の次の行を取り出したい場合だろw 欲嫁
0019名無しさん@お腹いっぱい。
2012/06/09(土) 14:01:37.890020名無しさん@お腹いっぱい。
2012/06/09(土) 14:07:19.90まあ、ふつーはそれすらせずに>>15だが。
0021名無しさん@お腹いっぱい。
2012/06/09(土) 14:18:33.49取り出したいのですが、何か簡便な方法はありませんか?」
という質問だったとしたら?
0022名無しさん@お腹いっぱい。
2012/06/09(土) 14:18:49.340023名無しさん@お腹いっぱい。
2012/06/09(土) 17:31:36.34あんまり釣れないね。
0024名無しさん@お腹いっぱい。
2012/06/09(土) 21:38:41.95何か簡便な方法がありましたらお願いします。
0025名無しさん@お腹いっぱい。
2012/06/09(土) 21:46:40.88次の行も欲しいってのなら>>17の言うとおり-Aオプション使うのが簡単じゃないかな
次の行だけ欲しいってのならgrep 〜 | sed -n '/pattern/{n;p}' とか。まあこれは2行連続でパターンマッチする可能性がある場合は使えないんだけど。
あとはawkかperlあたりで適当なスクリプト組むくらいかねえ
0027名無しさん@お腹いっぱい。
2012/06/10(日) 05:16:55.250028名無しさん@お腹いっぱい。
2012/06/10(日) 14:21:25.03たとえば
hoge=`ls -l`
とやると、改行が格納されません。
改行を含めた結果を格納するのはどのようにしたら良いのでしょうか?
0029名無しさん@お腹いっぱい。
2012/06/10(日) 14:32:53.34hoge=`ls -l` で改行は格納される。
echo $hoge ではなく、
echo "$hoge"
で変数の値を取り出すこと。
0030名無しさん@お腹いっぱい。
2012/06/10(日) 14:43:07.380031名無しさん@お腹いっぱい。
2012/06/12(火) 18:12:34.43このコマンドどこに問題がありますか?
最初の20行分しか処理されずに止まっちゃうんだけど・・・泣
0032名無しさん@お腹いっぱい。
2012/06/12(火) 18:19:37.78#!/bin/bash
ssh user@hostname
パスワードを入力するコマンド
上記のようなスクリプトが作りたいです。
どなたか教えて頂けないでしょうか。よろしくお願いします。
0033名無しさん@お腹いっぱい。
2012/06/12(火) 18:34:26.09echo unko | ssh user@hostname
0034名無しさん@お腹いっぱい。
2012/06/12(火) 18:46:46.29公開鍵認証じゃだめなん?
0035名無しさん@お腹いっぱい。
2012/06/12(火) 18:49:57.90それじゃだめじゃね。
0036名無しさん@お腹いっぱい。
2012/06/12(火) 18:59:21.99>>31
はスレチでした?
0037名無しさん@お腹いっぱい。
2012/06/12(火) 19:06:40.96試してみたのですが、パスワード入力を求められました。。
>>34
パスワード入力したいです。
0038名無しさん@お腹いっぱい。
2012/06/12(火) 19:16:56.4720行毎に別々に sh -c "...." が起動されるから、
> @.log 2> err.log とかが全部上書きされて
最後に書いた20行分しか残らない。
0039名無しさん@お腹いっぱい。
2012/06/12(火) 20:08:55.76すみませんが詳しい方のみ回答をお願いします
0040名無しさん@お腹いっぱい。
2012/06/12(火) 20:17:55.37> progress.log じゃなくて
>> progress.log じゃないの?
0041名無しさん@お腹いっぱい。
2012/06/12(火) 20:20:23.43すみませんが詳しい方のみ回答をお願いします
0042名無しさん@お腹いっぱい。
2012/06/12(火) 20:26:15.130043名無しさん@お腹いっぱい。
2012/06/12(火) 20:29:12.040044名無しさん@お腹いっぱい。
2012/06/12(火) 20:29:30.99すみませんが詳しい方のみ回答をお願いします
0045名無しさん@お腹いっぱい。
2012/06/12(火) 20:31:12.330046名無しさん@お腹いっぱい。
2012/06/12(火) 20:33:43.17findってこと?
結局どうすれば正解なの?
入力(ls -1):
a
b
c
d
e
f
実行されたいコマンド(xargs -L1 -P2)
./a.out a
./a.out b
====終わってから
./a.out c
./a.out d
====終わってから
./a.out e
./a.out f
って感じにしたいわけだけど。
0047名無しさん@お腹いっぱい。
2012/06/12(火) 20:35:02.58お願いだから邪魔しないで。
0048名無しさん@お腹いっぱい。
2012/06/12(火) 20:44:15.91むしろ
./a.out a
./a.out b
====ここで止まっちゃう
のが大問題。
0049名無しさん@お腹いっぱい。
2012/06/12(火) 21:29:01.48>>42
が言ってるのは出力が端末でないなら ls -1 しなくても ls でいいって話.
xargs -L1 -P2の挙動があくまで2プロセス同時にやるって話だから
./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
望みの挙動にするのは一行スクリプトだと割と面倒だから素直にmakeで依存関係書いてmake -j 20とかした方がいいかも
ちなみに俺の環境で >>31 を試してみたけどちゃんと20行以降も実行される.
可能性として気になったのはnohupの位置なんだけど
もしかして実行開始してから端末閉じたりしてる?
0050名無しさん@お腹いっぱい。
2012/06/12(火) 22:31:56.89丁寧にありがとう。
しばらく使わないと忘れるんだけど、
> ./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
これはまったく問題ない。説明不足ですまんかった。
> もしかして実行開始してから端末閉じたりしてる?
たぶん、それが原因だと思う。
ただ、xargの中に入れるのも混乱してしまうんだ。
どうすればうまく生き残るの?
0051名無しさん@お腹いっぱい。
2012/06/12(火) 22:39:01.73俺はnohupの挙動がちょっと曖昧だから確信持てないけど
nohupを先頭に持ってくるか
#!/bin/sh
ls -1 | xargs ...
っていうのを書いたファイル用意してnohup付けて実行するとか
あとはnohupじゃなくてCtrl-Zで一時停止 -> bg -> disown したり screen で代用してみるとか
0052名無しさん@お腹いっぱい。
2012/06/12(火) 23:12:10.37めっちゃ参考になる。ありがとう。
なんかパイプで色々つなぐのはいいけど、結局クォーテーションマークで躓くんだよね。
もうちょっと真面目に考えて設計してほしいわ。
0053名無しさん@お腹いっぱい。
2012/06/13(水) 00:35:25.15at コマンド使うほうが素直な気がする。
もっともバッチ処理システム入れて管理すれば batch コマンド以上に
いろいろかゆいところに手が届いていいと思うが。
0054名無しさん@お腹いっぱい。
2012/06/14(木) 14:17:28.57だとファイル名が表示されるだけで、
echo *.csv | xargs cat
だとファイルの中身が表示されるのはなぜでしょうか?
xargsを付けなくてもファイルの中身が表示されると思ってました。。
0055名無しさん@お腹いっぱい。
2012/06/14(木) 14:20:16.35man cat 読め。
0056名無しさん@お腹いっぱい。
2012/06/14(木) 14:23:59.09$ echo 54nobaka | cat
54nobaka
は間違いで、
$ echo 54nobaka | cat
cat: 54nobaka: No such file or directory
が正しいと言うことになるな。
あり得ん。
0057名無しさん@お腹いっぱい。
2012/06/14(木) 14:28:27.78だとファイルの中身が表示されるのに、
echo *.csv | xargs cat
だとそのようなファイルやディレクトリはありませんになることがあります。
man cat 読んでもわかりません。
0058名無しさん@お腹いっぱい。
2012/06/14(木) 14:30:22.51cat: 54nobaka: No such file or directory
の意味は分からなかったけど、標準入力に渡してもダメ、引数に渡せってこと?
0059名無しさん@お腹いっぱい。
2012/06/14(木) 14:41:19.14*.csv にマッチするファイルがないから
*.csv がそのまま渡った、とかじゃないの。
>>58
そう。
引数なしの cat は
標準入力から受け取ったものをそのまま標準出力に渡す。
0060名無しさん@お腹いっぱい。
2012/06/14(木) 14:44:47.08なるほど。ありがとうございます!
cat *.csvとすれば良いから、わざわざ|とexec使う必要もなかったですね。
0061名無しさん@お腹いっぱい。
2012/06/14(木) 14:49:06.50>*.csv にマッチするファイルがないから
*.csv にマッチするファイルはあります。
■ このスレッドは過去ログ倉庫に格納されています