トップページunix
1001コメント289KB

シェルスクリプト総合 その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/
0724名無しさん@お腹いっぱい。2012/08/20(月) 00:40:15.07
GNU binutilsか何かにrealpathは入ってるから、入れろ
0725名無しさん@お腹いっぱい。2012/08/20(月) 00:40:16.43
Perlのrealpath関数でも使っておけ
0726名無しさん@お腹いっぱい。2012/08/20(月) 01:00:03.17
acroreadの起動スクリプト(シェルスクリプト)とか参考になるんじゃないかな
0727名無しさん@お腹いっぱい。2012/08/20(月) 01:56:51.87
>>721
完璧な方法

1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す
07287212012/08/20(月) 02:27:37.26
>>722-727
ありがとう
readlink -f
を使うことにします
0729名無しさん@お腹いっぱい。2012/08/20(月) 06:32:20.27
>>727
それだと対象ファイルがパーミッションでopenできない時に使えない。

openせずに直接 statした方が良い。
0730名無しさん@お腹いっぱい。2012/08/20(月) 06:40:53.50
>>726
acroreadの起動スクリプトって、ls -lの出力をsedしたりしてるから、
path名に特殊記号とかスペースが入ってる場合を考慮してないし、
全然完璧じゃないよ。
0731名無しさん@お腹いっぱい。2012/08/21(火) 15:37:54.91
パイプで最初の一行目だけを取得するにはどう書けばよいでしょうか?
ls -t | <最初の一行目を抽出するコマンド>
のような使いかたがしたいのですが。
0732名無しさん@お腹いっぱい。2012/08/21(火) 15:42:20.18
すみません、宿題で使うので説明も書いてほしいです。
0733名無しさん@お腹いっぱい。2012/08/21(火) 15:42:47.76
head -n1 じゃダメなのん?
0734名無しさん@お腹いっぱい。2012/08/21(火) 15:48:22.55
宿題なら他人と同じ答じゃ評価低いよな。

head -n 1 や head -1 は多数が回答するから面白くない。

sed -n 1p あたりで回答しとけ。評価上がるぞ。
0735名無しさん@お腹いっぱい。2012/08/21(火) 15:51:18.32
>>731
俺と同じ授業か? 俺は awk NR==1 で提出するから真似するなよ。
0736名無しさん@お腹いっぱい。2012/08/21(火) 15:57:36.75
じゃあ俺はbrainf*ckあたりで一行目を表示するスクリプト書くわー
0737名無しさん@お腹いっぱい。2012/08/21(火) 15:59:31.28
オレこれ↓
ls -t | (read f; echo "$f")
07387312012/08/21(火) 16:00:29.24
教えていただけてありがとうございました。
0739名無しさん@お腹いっぱい。2012/08/21(火) 16:48:36.64
sed -n 1pとhead -n 1じゃ前者はカス。
何故カスかという効率の差に関して記述すれば評価上がるぞ。
0740名無しさん@お腹いっぱい。2012/08/21(火) 16:51:32.61
>>739
sed 1q ならどうですか?
0741名無しさん@お腹いっぱい。2012/08/21(火) 16:58:40.58
headとかsedのプロセス起動のコストを考えると
シェル側でパイプ開いてreadするのが最強
0742名無しさん@お腹いっぱい。2012/08/21(火) 20:14:52.48
シェルへのパッチをレポートに貼るのか
0743名無しさん@お腹いっぱい。2012/08/22(水) 01:21:58.16
printf 'r !ls -t\n1p\nw' | ed -

パイプは使ったが
> ls -t | <最初の一行目を抽出するコマンド>
の形になってないからだめか
07447432012/08/22(水) 01:29:14.30
ls -t | printf "i\n`cat /dev/stdin`\n.\n1p\nw" | ed -

こうしたら一応できた
0745名無しさん@お腹いっぱい。2012/08/22(水) 01:40:47.17
FreeBSDではedがworldに含まれてるから当然インストールされてるんだけど
Linux系ではed入ってないことも多いんだよなあ。
0746名無しさん@お腹いっぱい。2012/08/22(水) 02:57:14.91
そうだっけ?Linuxでも割と入ってるイメージがある
中身はもしかしたらexモードのvim.tinyとかだったりするのかも知らんがw
0747名無しさん@お腹いっぱい。2012/08/22(水) 03:14:43.87
Linuxならedなしbusyboxなディストリビューションもあるわけで。
0748名無しさん@お腹いっぱい。2012/08/22(水) 15:08:45.07
edが入っていないなんてもはやunixじゃないな…ああ元々unixじゃなかった。
0749名無しさん@お腹いっぱい。2012/08/22(水) 22:33:02.24
fedoraに普通に入ってる ed-1.5-3.fc17.x86_64
0750名無しさん@お腹いっぱい。2012/08/22(水) 23:14:05.90
そういうことは聞いてない。
0751名無しさん@お腹いっぱい。2012/08/26(日) 11:54:24.95
初歩的な質問ですみません
グレイヴコマンド(例:echo `date` の`date`)はネストできませんが、
ネストしたような働きをさせるにはどうコマンドしたらよいでしょうか
0752名無しさん@お腹いっぱい。2012/08/26(日) 12:01:34.46
>>751
echo `echo ¥`date¥``
0753名無しさん@お腹いっぱい。2012/08/26(日) 12:03:20.51
$()が使える環境ならそっちを使う方がいいかもしれん
0754名無しさん@お腹いっぱい。2012/08/26(日) 12:11:27.99
なるほど ありがとうございます
0755名無しさん@お腹いっぱい。2012/08/30(木) 23:13:56.24
初歩的な質問ですみません。
レッドハットとHP-UX混在環境です。

サーバーA、サーバーB、サーバーCとあり
全て異なるネットワークに属しているサーバで
ftpやhulftでのファイルやり取りを行います。

サーバー間でファイルの送受信を行うスクリプトを組むのですが、
ファイルごとに組むと100本近くになってしまうため、外部定義ファイルにパスなどを記述し
そこからパスなどを読んで処理するような作りをかんがえてます。

例えばhulftならhulft idを引数にしてそのhulft idの行にファイルのパスやファイル名、
sendなのかrecvなのかを記載しそれらをスクリプト内で代入出来ればいいんじゃないか
と思ったのですが具体的な構文がいまいち浮かびません。

またサーバーA上にシェルA、サーバーB上にシェルBといて
シェルBはシェルAからキックされる場合、引数や変数は継承されますでしょうか。
0756名無しさん@お腹いっぱい。2012/08/30(木) 23:23:26.73
>>755
ファイル名にスペース等が含まれていないなら、

for file in `cat 外部定義ファイル`; do ...
で行ける。

異なるサーバー上のシェルに変数は継承されない。
引数は明示的に引数を渡せば当然継承される。
0757名無しさん@お腹いっぱい。2012/08/31(金) 09:31:26.31
どのシェルが普通なのか俺には分からない
少なくとも、バッシュやZSHかな大別できるのは…
Kshは癖があるな。
シェルを実行するためには、chmodのコマンド手続きがいるだろ?
そんなこと初心者には周知されていない。
コマンド入力にしても ./付けるとかひと工夫しないとだめだ。
この件も初心者には周知されていない。
初心者と言ってもシェル経験者ならPATHで権限を付ける知識くらいはある。
しかし、Windowsの経験者にはPATHの概念さえ聞いたことも何ができるかも
わからない筈だ。
0758名無しさん@お腹いっぱい。2012/08/31(金) 09:47:52.57
詩の宿題かなんか?
0759名無しさん@お腹いっぱい。2012/08/31(金) 12:48:53.44
export PATH="$PATH,."
0760名無しさん@お腹いっぱい。2012/08/31(金) 12:50:56.18
>>759
馬鹿は無理に答えなくていいよw
0761名無しさん@お腹いっぱい。2012/08/31(金) 13:04:38.23
>>760
どっか間違ってました?
0762名無しさん@お腹いっぱい。2012/08/31(金) 13:07:21.17
,じゃなく:だろ、と
.を含めちゃいかんだろ、と。
0763名無しさん@お腹いっぱい。2012/08/31(金) 13:08:11.26
>>757
勉強不足を人のせいにされてもなぁ。
0764名無しさん@お腹いっぱい。2012/08/31(金) 13:21:45.38
>>762
ああコロンでしたかすいません
前読んだ本にはlsっていうウイルスがカレントディレクトリにあったときに備えて.は置かない方がいいって書いてたけどPATHの後ろに書いとけば大丈夫かと



あとWindowsにもPATH変数はあるけどコントロールパネル->システム->どっかのタブ->環境変数って辿らないと設定するとこまでたどりつけなくてしかも再起動しないと反映されないありさまだったような
0765名無しさん@お腹いっぱい。2012/08/31(金) 14:24:17.00
slっていうウイルスがいるかもよ
0766名無しさん@お腹いっぱい。2012/08/31(金) 15:34:17.51
バッシュと呼ぶのやめようぜ。
かなりカッコ悪い。
0767名無しさん@お腹いっぱい。2012/08/31(金) 15:39:47.48
良く口頭でビーシェルみたいな言い方する人いるけど
あれってbashのことなんだろうか。
0768名無しさん@お腹いっぱい。2012/08/31(金) 16:03:33.42
そういうネタはいいです
0769名無しさん@お腹いっぱい。2012/08/31(金) 23:12:05.50
>>764
大丈夫じゃねーよ、バカ。
0770名無しさん@お腹いっぱい。2012/09/01(土) 02:21:32.43
触るな危険
0771名無しさん@お腹いっぱい。2012/09/01(土) 09:17:52.29
grepして見つかった行の前5行を出力するってできないでしょうか?
0772名無しさん@お腹いっぱい。2012/09/01(土) 09:27:17.81
マッチした行を含めていいなら -B 6 でいいと思う
0773名無しさん@お腹いっぱい。2012/09/01(土) 09:31:57.03
-B 5 だろw
0774名無しさん@お腹いっぱい。2012/09/01(土) 14:01:09.12
ここでの話しはレベルが高いのか低いのかようわからんな
0775名無しさん@お腹いっぱい。2012/09/02(日) 04:13:15.79
ash=エーシェル
bash=バッシュ
csh=シーシェル
d-shell=ディーシェル
sh=ビーシェル
tcsh=ティーシーシェル
zsh=ゼットシェル

バッシュだけアホみたい。
0776名無しさん@お腹いっぱい。2012/09/02(日) 09:58:21.31
zshはcshにそろえて読まなきゃ駄目よ
0777名無しさん@お腹いっぱい。2012/09/02(日) 10:08:27.84
>>775
「z」は、
イギリス発音なら「ゼッ『ド』」
アメリカ発音なら「ズィー」
どこにも「ゼット」なんて発音はない。
中学英語からやり直しだなw
0778名無しさん@お腹いっぱい。2012/09/02(日) 15:38:49.68
Zを日本人がゼットって読むのはイギリス英語が基だったのか。勉強になった
0779名無しさん@お腹いっぱい。2012/09/02(日) 16:01:49.22
>>777
俺も z はズィーと習ったけどさ、
zsh をズィーシェルと読むヤツには会った事無い。
0780名無しさん@お腹いっぱい。2012/09/02(日) 17:01:28.91
で、dashは?
0781名無しさん@お腹いっぱい。2012/09/02(日) 17:05:15.94
>>780
鉄腕
0782名無しさん@お腹いっぱい。2012/09/02(日) 17:34:15.94
>>781
ググるとそっちばっかりヒットするよなw
0783名無しさん@お腹いっぱい。2012/09/03(月) 00:53:44.84
ゼットシェルで問題ないよ。
[zed-?el]が[?]に接続して、無声化して[zet-?el]
0784名無しさん@お腹いっぱい。2012/09/03(月) 11:20:15.54
そもそもとしてゼッドもゼットもどちらも正しいけどな
0785名無しさん@お腹いっぱい。2012/09/03(月) 11:35:09.44
zshは「ズシュ」
0786名無しさん@お腹いっぱい。2012/09/05(水) 02:43:38.45
いつもざしゅって読んじゃう。
0787名無しさん@お腹いっぱい。2012/09/05(水) 07:54:36.01
ザシャァッ(車田調
0788名無しさん@お腹いっぱい。2012/09/07(金) 00:21:56.75
雑種
0789名無しさん@お腹いっぱい。2012/09/08(土) 13:09:33.30
ゼットエスエイチとか
ゼットシェル

日本人なんだからZの読み方にこだわる必要なし
0790名無しさん@お腹いっぱい。2012/09/08(土) 15:23:53.34
だな。今後はゼータシェルって言うことにするよ
0791名無しさん@お腹いっぱい。2012/09/09(日) 11:41:33.37
世紀末風に言うとジードシェル
0792名無しさん@お腹いっぱい。2012/09/09(日) 13:14:38.93
もっと捻るかマトモなネタないのかよ
0793名無しさん@お腹いっぱい。2012/09/09(日) 13:22:46.94
仕事で古いパソコンを使っています。OSはUNIX-OSです。
このマシンにbashを入れたいのですが、UNIX-OS用のbashバイナリが
入手できるところをご存知の方いらっしゃいましたら、入手先を教えて下さい。

ソースからコンパイルするのは、私があまりUNIX-OSに詳しくないので、あまり気が
進まないのですが、もしもコンパイルするしかないのでしたら、ソース入手先を
教えて頂けないでしょうか。
また、コンパイルしか手段が無いとしたら、UNIX-OSでは、bashのバージョンいくつまで
対応可能でしょうか。
0794名無しさん@お腹いっぱい。2012/09/09(日) 13:35:34.28
ネタにしてはつまらなすぎる。マジな質問ならば今のキミの知識では無理としか答えようがない。
0795名無しさん@お腹いっぱい。2012/09/09(日) 14:25:33.64
2台セットの激安PCを買ったんですが、テレビが付いてなくて、、
ケーブル買ってやっと居間のテレビにつないだんですけど、
電源を入れるとオペラシステム、ナンバーTが見つかった、
みたいなシェル画面が出て先に進みません。2台ともそうです。
この後どういうシェルコマンドを打てばいいのでしょうか?
0796名無しさん@お腹いっぱい。2012/09/09(日) 17:39:59.21
よくわかんないけどシェルの事ならシェルに聞いてみるのが一番いいよ。
http://www.shell.co.jp/
0797名無しさん@お腹いっぱい。2012/09/09(日) 18:20:22.56
ありがとうございました。今環境がないので今度客先で試してみます。
0798名無しさん@お腹いっぱい。2012/09/09(日) 18:42:25.39
いいクオリティしてますね
0799名無しさん@お腹いっぱい。2012/09/11(火) 12:23:14.32
マスコミは特亜系エセ左翼・カルト宗教団体が行っている組織的な嫌がらせ、集団ストーキング、電磁波悪用、「ガスライティング」を報道しろ
0800名無しさん@お腹いっぱい。2012/09/13(木) 01:14:45.24
全くシェルスクリプトを触ったことない素人なのですが、cdを変更して
あるファイルをmakeするのが面倒なので自動化させたいです。
させたい処理はcd変更→makeの2点だけです。
ですが、うまくいきません。(シェルが一瞬立ち上がってそのまま終了します)
シェルにどういう引数を与えて起動させればいいでしょうか。
0801名無しさん@お腹いっぱい。2012/09/13(木) 01:23:56.91
make -C directory
0802名無しさん@お腹いっぱい。2012/09/13(木) 01:31:25.80
>>801
どういうことでしょうか?
bash make -C directoryでしょうか?
えーと、makeは-fオプションで行いたいので、bash make -f directoryですか?
0803名無しさん@お腹いっぱい。2012/09/13(木) 01:35:05.89
>>801
あ、いや、つまり-Cでcd変更を兼ねるわけですね。理解しました
それで、その前にシェルを起動させなければいけないのですが、シェル起動→make -C directoryまでを
一連の動作として行うにはどうすればいいでしょう亜k?
0804名無しさん@お腹いっぱい。2012/09/13(木) 02:03:13.41
んっと、自分の考えた「手段」に固執して
シェル起動とかいう独自用語使ってるとアドバイス来ないよ。
「何をしたら何が起きてほしい」と「目的」が重要。
0805名無しさん@お腹いっぱい。2012/09/13(木) 02:32:36.62
リンクか何かをクリックしたらbashが起動してmakefileしたいです。
0806名無しさん@お腹いっぱい。2012/09/13(木) 02:35:29.22
しかしシェルスクリプトを直接起動するのはNGで、必ずbashに引数を与えて起動させなければならないとします
0807名無しさん@お腹いっぱい。2012/09/13(木) 02:40:38.93
そして最も求めている手段がshにオプション引数としてシェルスクリプトを与えて起動し、makefileする方法です
0808名無しさん@お腹いっぱい。2012/09/13(木) 06:26:57.77
はい、次の方どうぞ
0809名無しさん@お腹いっぱい。2012/09/13(木) 06:38:48.75
先生、ぼくも同じ物を探しています
0810名無しさん@お腹いっぱい。2012/09/13(木) 07:40:19.71
「cd変更」って何だ。
0811名無しさん@お腹いっぱい。2012/09/13(木) 07:52:00.73
マウントしなおすんだと思ってたw
0812名無しさん@お腹いっぱい。2012/09/13(木) 08:36:35.52
しきりに「シェルを起動」って言ってるのは、
端末エミュレータ起動のことだろうとエスパー。
あるいはcygwin環境なのかも試練。

が、そういう低レベルの質問はお断りなので、
次の方どうぞ
0813名無しさん@お腹いっぱい。2012/09/13(木) 08:40:27.04
>>805-807
デスクトップと端末エミュレータとshとbashとシェルスクリプトとオプション引数とmakeとmakefileとcdとカレントディレクトリと手段と目的がごっちゃになってる。
整理して出直せ。
0814名無しさん@お腹いっぱい。2012/09/13(木) 10:11:28.58
端末エミュレーターxtermはUNIX系のほとんどのOSに対応してるって聞いたんですが、
xtermでFreeBSDのコマンドが実行できません。FreeBSDは対応してないんでしょうか?
関係あるかどうかわかりませんが、ホストOSはLinuxです。
0815名無しさん@お腹いっぱい。2012/09/13(木) 10:21:58.22
お薬出しておきますね

次の方どうぞ
0816名無しさん@お腹いっぱい。2012/09/13(木) 21:30:04.47
>>814
FreeBSDもLinuxもUNIXじゃありません。
0817名無しさん@お腹いっぱい。2012/09/13(木) 21:34:21.69
>>816
この板にfreeBSDスレ立ってますがイタチと言われません
→freeBSDはUNIX

UNIX系OS用ソフトの大半はLinuxで動きますしディレクトリ構造が同じです
→LinuxはUNIXライク
0818名無しさん@お腹いっぱい。2012/09/13(木) 21:51:52.27
>>817
freeBSDなんていうあなたが発明したシステムが
UNIXかどうかは、ほかの人にはわかりません。
0819名無しさん@お腹いっぱい。2012/09/13(木) 22:11:31.87
出されたお薬はちゃんと飲んでください
0820名無しさん@お腹いっぱい。2012/09/13(木) 22:18:29.90
ハイ、わかりますた。
でも飲んだか飲んでないか、すぐ忘れちゃうんです。
0821名無しさん@お腹いっぱい。2012/09/13(木) 23:02:26.98
飲んだかどうか記録するシェルスクリプト作るといいです
0822名無しさん@お腹いっぱい。2012/09/13(木) 23:28:44.84
そのスクリプトを起動する事を忘れちゃうんです

っつーかある意味、マジな話、一日一度、cronやatを使えず、どうしても手動で
動かさなければならない手順を、結構いつも忘れてしまう…
0823名無しさん@お腹いっぱい。2012/09/13(木) 23:29:59.39
$ while true; do sleep 86400; ./hoge; done
■ このスレッドは過去ログ倉庫に格納されています