1read 100read
2012年09月UNIX45: シェルスクリプト総合 その20 (939) TOP カテ一覧 スレ一覧 2ch元 削除依頼
NEC EWS4800 サイコー (313)
tcpdumpを用いて他人の通信を盗聴したら犯罪 (344)
SolarisとLINUXどっち??? (745)
日記観察 その捌 (606)
Keyboard キーボード 3 (330)
はたしてこの板を見てる女はいるのか? (346)

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


1 :2012/06/08 〜 最終レス :2012/10/30
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合は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/

2 :
太古の昔に
レイヤードシェル
もしくは
シェルレイヤー
という物が存在していたらしいのですが、
どんな物だったのでしょうか?
ジョブコントロールできるらしいのですが。

3 :
おつ

4 :
UNIXとかいう糞PCwwwwwww京とかいう存在しても価値ないただただ無意味に速度早くしただけのコンピューターとかもあるしww
何のための板だよここwww

5 :
ようこそ、その糞みたいな板にワザワザご苦労様。

6 :
Q. シェルは UNIX の勉強に使えますか?
A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
  UNIX の勉強には向いていません。

7 :
>>6
頭大丈夫か?
シェルを全く使用せずにUNIXの勉強とか、どんなアクロバットだよw

8 :
>>2
GNUScreenから画面管理を引いたようなもの。

9 :
>>6
つまり座学で基礎理論を学んでから出直せってこと?

10 :
>>2
衣服(shell)の重ね着(layered)のことだろ。
登山なんかでは速乾性の下着から防水防風透湿のジャケットまで
機能の異なる薄手のシェルを何枚も重ねて着るのが常識。

11 :
>>2 shl BSDのジョブコントロールのSysV版
http://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

12 :
>>8が端的に説明できてる。ただscreen知らないとわからない。

13 :
シェルといえば、ガソスタだろ?または、>>10だな。常識。
... なる程、shlか。知らなかった。sh -kといい、まさにトリビア級。すごい。

14 :
grepで取り出した10行のうちの2行目を取り出したいのですが、
何か簡便な方法はありませんか?

15 :
sed -n 2p

16 :
>>14
素人は grep 〜 | head -n 2 | tail -n 1 なんてするところだろうな
Cで2行目取り出すツールを書くのが最速
fgetc()とかで何とかなる

17 :
>>14
grep -A1
でいいじゃん。
一致した行自体も出るけど、エスパーするとむしろその方がいいと出てる。

18 :
>>17
それは一致した行の次の行を取り出したい場合だろw 欲嫁

19 :
なぜにfgetsじゃなくてfgetc?

20 :
…などとデバッグしてるぐらいなら head -n 2 | tail -n 1 の方がずっと早いな。
まあ、ふつーはそれすらせずに>>15だが。

21 :
「grepで引っかかる行が10行あります。これら10行それぞれの次の行(2行目)を
取り出したいのですが、何か簡便な方法はありませんか?」

という質問だったとしたら?

22 :
効率的には grep -m2 〜 | tail -n1 とかの方がいいのかね

23 :
>>16
あんまり釣れないね。

24 :
質問がわかりにくくて済みません。実は >>21 さんの意味で質問しました。
何か簡便な方法がありましたらお願いします。

25 :
>>24
次の行も欲しいってのなら>>17の言うとおり-Aオプション使うのが簡単じゃないかな
次の行だけ欲しいってのならgrep 〜 | sed -n '/pattern/{n;p}' とか。まあこれは2行連続でパターンマッチする可能性がある場合は使えないんだけど。
あとはawkかperlあたりで適当なスクリプト組むくらいかねえ

26 :
しまった >>25 は grep 必要なかった

27 :
環境変数IFSってforとread以外に使い道あるのかしら

28 :
コマンドを実行した複数行の結果を変数に格納した後、その各行に処理を行いたいのですが、
たとえば
hoge=`ls -l`
とやると、改行が格納されません。
改行を含めた結果を格納するのはどのようにしたら良いのでしょうか?

29 :
>>28
hoge=`ls -l` で改行は格納される。

echo $hoge ではなく、
echo "$hoge"
で変数の値を取り出すこと。

30 :
早速の回答、誠にありがとうございまする

31 :
ls -1 | nohup xargs -L1 -P20 -I@ sh -c "./a.out @ < @.txt > @.log 2> err.log" > progress.log &
このコマンドどこに問題がありますか?
最初の20行分しか処理されずに止まっちゃうんだけど・・・泣

32 :
expectコマンドを使わずにシェルスクリプトでパスワードを自動入力させるにはどのようにすればよいでしょうか?
#!/bin/bash
ssh user@hostname
パスワードを入力するコマンド
上記のようなスクリプトが作りたいです。
どなたか教えて頂けないでしょうか。よろしくお願いします。

33 :
>>32
echo unko | ssh user@hostname

34 :
>>32
公開鍵認証じゃだめなん?

35 :
>>33
それじゃだめじゃね。

36 :
質問者ですが、
>>31
はスレチでした?

37 :
>>33
試してみたのですが、パスワード入力を求められました。。
>>34
パスワード入力したいです。

38 :
>>31
20行毎に別々に sh -c "...." が起動されるから、
> @.log 2> err.log とかが全部上書きされて
最後に書いた20行分しか残らない。

39 :
>>38
すみませんが詳しい方のみ回答をお願いします

40 :
>>31
> progress.log じゃなくて
>> progress.log じゃないの?

41 :
>>40
すみませんが詳しい方のみ回答をお願いします

42 :
パイプ出力なのに ls -1 とかやるのは素人

43 :
すみませんが詳しい方のみ質問をお願いしますw

44 :
>>42
すみませんが詳しい方のみ回答をお願いします

45 :
すみませんが詳しい方のご健闘をお祈りします

46 :
>>42
findってこと?
結局どうすれば正解なの?
入力(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
って感じにしたいわけだけど。

47 :
ちなみに39とかは質問者(31+46)じゃないから。
お願いだから邪魔しないで。

48 :
出力はまああまり気にしてなくて、
むしろ
./a.out a
./a.out b
====ここで止まっちゃう
のが大問題。

49 :
>>46
>>42
が言ってるのは出力が端末でないなら ls -1 しなくても ls でいいって話.
xargs -L1 -P2の挙動があくまで2プロセス同時にやるって話だから
./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
望みの挙動にするのは一行スクリプトだと割と面倒だから素直にmakeで依存関係書いてmake -j 20とかした方がいいかも
ちなみに俺の環境で >>31 を試してみたけどちゃんと20行以降も実行される.
可能性として気になったのはnohupの位置なんだけど
もしかして実行開始してから端末閉じたりしてる?

50 :
>>49
丁寧にありがとう。
しばらく使わないと忘れるんだけど、
> ./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
これはまったく問題ない。説明不足ですまんかった。
> もしかして実行開始してから端末閉じたりしてる?
たぶん、それが原因だと思う。
ただ、xargの中に入れるのも混乱してしまうんだ。
どうすればうまく生き残るの?

51 :
>>50
俺はnohupの挙動がちょっと曖昧だから確信持てないけど
nohupを先頭に持ってくるか
#!/bin/sh
ls -1 | xargs ...
っていうのを書いたファイル用意してnohup付けて実行するとか
あとはnohupじゃなくてCtrl-Zで一時停止 -> bg -> disown したり screen で代用してみるとか


52 :
>>51
めっちゃ参考になる。ありがとう。
なんかパイプで色々つなぐのはいいけど、結局クォーテーションマークで躓くんだよね。
もうちょっと真面目に考えて設計してほしいわ。

53 :
少なくともバッチ処理なんだから nohup とか使うんじゃなくて batch とか
at コマンド使うほうが素直な気がする。
もっともバッチ処理システム入れて管理すれば batch コマンド以上に
いろいろかゆいところに手が届いていいと思うが。

54 :
echo *.csv | cat
だとファイル名が表示されるだけで、
echo *.csv | xargs cat
だとファイルの中身が表示されるのはなぜでしょうか?
xargsを付けなくてもファイルの中身が表示されると思ってました。。

55 :
cat がそういう作りだから。
man cat 読め。

56 :
>>54の挙動だと、
$ echo 54nobaka | cat
54nobaka
は間違いで、
$ echo 54nobaka | cat
cat: 54nobaka: No such file or directory
が正しいと言うことになるな。
あり得ん。

57 :
cat *.csv

だとファイルの中身が表示されるのに、

echo *.csv | xargs cat

だとそのようなファイルやディレクトリはありませんになることがあります。

man cat 読んでもわかりません。

58 :
>>56
cat: 54nobaka: No such file or directory
の意味は分からなかったけど、標準入力に渡してもダメ、引数に渡せってこと?

59 :
>>57
*.csv にマッチするファイルがないから
*.csv がそのまま渡った、とかじゃないの。
>>58
そう。
引数なしの cat は
標準入力から受け取ったものをそのまま標準出力に渡す。

60 :
>>59
なるほど。ありがとうございます!
cat *.csvとすれば良いから、わざわざ|とexec使う必要もなかったですね。

61 :
>>59
>*.csv にマッチするファイルがないから

*.csv にマッチするファイルはあります。

62 :
>>61
んじゃファイル名にスペースが入ってるとか。

63 :
ファイル名にスペースは入ってません。

64 :
>>63
んじゃ具体的にどういうファイルがあるの?

65 :
年金記録-'06〜'10.csv

66 :
' ' が解釈されちゃってるな。

67 :
>>65
これは非道い。
オレには、ファイル名にクオテーションやダブルクオテーションを含める勇気はないわ

68 :
>>65
んじゃこれは
*\'*\'*.csv
でいけるのかな?

69 :
>>68
そんなことしても xargsの段階で解釈されるから無理だろ

70 :
どうしてもecho使いたいって条件だとキツいね
Linuxのlsなら-Qオプション使えるから
ls -Q *.csv | xargs cat
するかfind の -print0 と xargs の -0 組み合わせるぐらいだろうか。
まあfind使うならxargsじゃなくて-exec使えって話なんだろうが。

71 :
あとは普通にfor文使うとか
ファイル名に空白がある場合は使えないけど
$ echo -n *.csv | xargs -d ' ' cat
という説もある

72 :
すんません、ディレクトリツリー内で作成日時が最古のファイルを取得できるコマンドを教えてくださいませんか

73 :
>>72
一般的な方法はない。

74 :
>>73
すみませんが詳しい方のみ回答をお願いします

75 :
>>72
lsで日付順で取得してheadまたはtailじゃオーバーヘッド大きすぎ?
うちはめんどくさいからそれで済ませてるんだが

76 :
>>75
ディレクトリ「ツリー」だから、そもそもlsで日付順で取得できないだろw

77 :
>>75
それ作成日時じゃないよ。

78 :
あんまり巨大なツリーじゃなければ、zsh あたりで
ls -dtr **/* | head -1
とかか。
お題としては、ls -D か stat あたり使って、
巨大なツリーで日付ソートしろっていう方が楽しいけど。
ただし、「作成日時」には目をつぶる。

79 :
そこ目をつぶっちゃだめだろw

80 :
lsって最終変更日時とか状態変更日時とかアクセス日時は取れるのに、作成日時だけ取れないのな。
知らんかった。すまん。

81 :
取れるかどうかの問題じゃなくて、その情報があるかどうかだ

82 :
>>72
find /dir -printf '%T+ %p\n' | sort | head -1

83 :
>>82
それ作成日時じゃないよ。

84 :
>>83
そういうのはいいです。エスパーなら最終更新日時と詠み換えるべき。

85 :
エスパーじゃないもの。
書いてあることしか読み取れんよ。

86 :
>>72は聞いたっきり現れないな。
こりゃ釣られたか。

87 :
ツリーだけに…

88 :
ぷぷ

89 :
作成時刻を保持してるUNIX系OSってあるの?

90 :
UFS2にbirthtimeってのがあるらしい。

91 :
Linuxのext4にもbirth timeあるね

92 :
>>82
GNU依存乙

93 :
GNU dateが無いともう生きていけません
完全に陥落しました

94 :
>>93
どんな時に便利っすか

95 :
前日の日付を取得するときとか。

96 :
それは定番の手法があるだろう。

97 :
GNU date使うと楽すぎて。

98 :
あと変数でn日前とかも楽。

99 :
こんな感じっすか。
env TZ=JST+15 date
n=5
date -v -${n}d

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
unixと数学 (302)
Emacs Part 41 (496)
【火の鳥】Firebird【不死鳥】 (304)
いいかげんPC-98は捨てろ (624)
\chapter{\TeX} % 第八章 (647)
VM Wareってどうですか? (662)
--log9.info------------------
【歌詞】超パクリ魔こと堂本剛の盗作検証スレ【曲】 (352)
チャットモンチーvsホワイトベリー、どっちが上? (213)
KREVA顔キモイ生理的に無理 (272)
【ウザい】有線で流れまくって聞き飽きた歌10曲目 (474)
湯水の如く金掛けたのに売れなかった歌手 23人目 (631)
ミスチルの胡散臭さは悪質杉 (888)
【No.1】宇多田ヒカル VS 椎名林檎【対決】 (444)
B'z】オリコン1位常連こそ最強の証!【Mr.children (271)
日本人男性ボーカリスト歌唱力議論スレPart52 (553)
東方神起ジェジュンのロックな歌声 (217)
【EXILE】TAKAHIRO応援スレ☆44【ACE OF SPADE】 (499)
【盗作】B'zパクリ考察スレ【日本一】 (669)
【EXILE】 SHOKICHI part.2 【J Soul Brothers】 (774)
浜崎あゆみって、邦楽アー全員に嫌われてるの? (312)
スキマの中で自分が好きな曲 (684)
【安全地帯】玉置に怨みごとスレ【大阪・福岡公演】 (597)
--log55.com------------------
(^黄^)総合スレ(^黄^)そう思わない3件目
株質問・すごく優しく答えるスレ266
【コテ】コテを語ろう【半コテ】
【MONEX】マネックス証券 Part67【曲がり屋広木】
【1570】NF日経レバレッジ【ブル】
株質問・すごく優しく答えるスレ267
株質問・すごく優しく答えるスレ273
株質問・すごく優しく答えるスレ274