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

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

レス数が1000を超えています。これ以上書き込みはできません。
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/
0901名無しさん@お腹いっぱい。2012/09/24(月) 16:56:23.03
>>900
>>892>>896を読んだんだろう。
0902名無しさん@お腹いっぱい。2012/09/24(月) 17:31:58.97
who|wcがだめなのって、昔のshはパイプが^だったっていうだけのこと?
0903名無しさん@お腹いっぱい。2012/09/24(月) 18:05:51.19
>>902
7th Edition なら「|」でいいっぽい。
http://plan9.bell-labs.com/7thEdMan/v7vol2a.pdf
0904名無しさん@お腹いっぱい。2012/09/24(月) 18:31:49.56
>>903
んっと、実質いけるかじゃなくて、ドキュメント上の話ね
0905名無しさん@お腹いっぱい。2012/09/24(月) 18:36:10.23
あぁ
>>903
は、1979のドキュメントか。who|sortがちゃんと例に上がってるね。
who|wcが認められていないっていう出典は何だ?
0906名無しさん@お腹いっぱい。2012/09/24(月) 19:15:26.74
こっちだと出典が載ってる。
http://tiswww.case.edu/php/chet/bash/article.pdf

出典はこれ。>>903に含まれてるのと同じっぽい。
http://www.alcatel-lucent.com/bstj/vol57-1978/articles/bstj57-6-1971.pdf

でもなんでダメなのかはよくわからん。
0907名無しさん@お腹いっぱい。2012/09/24(月) 20:02:57.99
bstjのは who|grep $1 みたいな例があるから出典としてはおかしいんじゃないかな。
Chet Rameyの出典ミスのような気がする。

とりあえず、open problemは、初出のTom Duffのrc文献で
> It is remarkable that in the four most recent editions of the UNIX
> system programmer's manual the Bourne shell grammar described in the
> manual page does not admit the command who|wc.
の根拠がわからない点かな。

なのにあちこち引用されてるという……
0908名無しさん@お腹いっぱい。2012/09/26(水) 20:55:09.39
そんなことよりshのソースを見て驚愕しようぜ。
0909名無しさん@お腹いっぱい。2012/09/26(水) 20:58:49.31
      /⊇∧
  /⊇∧〈( ゚д゚)
`〈( ゚д゚)ヽ ⊂ニ)
 ヽ_と/ ̄ ̄ ̄/ |
  ̄\/___/ ̄ ̄
0910名無しさん@お腹いっぱい。2012/09/27(木) 13:34:15.65
ウニ臭ってさ、コマンドライン画面にエロアニメ少女のAA出して
オナニーするんだろ?

本当にキモいよな。
0911名無しさん@お腹いっぱい。2012/09/27(木) 15:53:41.99
AA ってなんですか。
0912名無しさん@お腹いっぱい。2012/09/27(木) 16:49:20.71
>>911
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%83%BC%E3%83%88
0913名無しさん@お腹いっぱい。2012/09/27(木) 22:53:41.05
マジレスってなんですか?
0914名無しさん@お腹いっぱい。2012/09/27(木) 23:37:10.23
>>913
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%AC%E3%82%B9
0915名無しさん@お腹いっぱい。2012/10/03(水) 23:49:51.10
わかる方いたら教えてください。
以下の@のようにコマンドを変数に代入して、実行したいのですが、どうすればよいですか。
多分、バックスラッシュが正しく認識されていない。。

@コマンドを変数に代入した場合はNG
cmd="find /tmp/ -name \*.tsv"
for f in `${cmd}`; do
echo ${f}
done

Aベタ書きするとOK
for f in `find /tmp/ -name \*.tsv`; do
echo ${f}
done
0916名無しさん@お腹いっぱい。2012/10/03(水) 23:54:39.82
for f in $(eval "$cmd");do
echo $f
done
0917名無しさん@お腹いっぱい。2012/10/04(木) 08:26:24.94
>>915
cmdに ' ' で代入すること " " だとバックスラッシュが解釈される。
0918名無しさん@お腹いっぱい。2012/10/08(月) 21:27:19.47
sed -e /1a porto=WPA/ wpa_supplicant.conf
で2行目にproto=WPAを挿入したしてますが、
タブ+proto=WPAを挿入するには、どうしたら出来ますか?


0919名無しさん@お腹いっぱい。2012/10/08(月) 21:38:16.14
>>918
sed -e '1a\\tporto=WPA' wpa_supplicant.conf
09209182012/10/08(月) 22:10:14.93
>919
あ、そうか
ありがとうございます。
0921名無しさん@お腹いっぱい。2012/10/09(火) 09:23:06.07
ある特定の命令を無視しろと命令したい場合どうすればいいの?
0922名無しさん@お腹いっぱい。2012/10/09(火) 09:57:32.69
命令ってなんのこと?
0923名無しさん@お腹いっぱい。2012/10/09(火) 10:01:49.88
あ、コマンドのこと。
0924名無しさん@お腹いっぱい。2012/10/09(火) 10:22:48.32
こういう事か? 突っ込みどころはいろいろあるがキミのレベルならこれで良い。

#!/bin/sh
ls () :
ls
0925名無しさん@お腹いっぱい。2012/10/09(火) 10:28:51.78
>>921
↓この人と一緒に考えるといい。
http://toro.2ch.net/test/read.cgi/tech/1348995216/574
0926名無しさん@お腹いっぱい。2012/10/10(水) 11:22:49.71
grepコマンドで、"---Hoge"という文字列を検索できません
どうしたらよいでしょうか
0927名無しさん@お腹いっぱい。2012/10/10(水) 11:26:04.61
まさか grep -- ---Hoge というオチじゃないだろな
0928名無しさん@お腹いっぱい。2012/10/10(水) 11:28:20.39
-- が使えないgrep用の解
grep '[-]--Hoge'
0929名無しさん@お腹いっぱい。2012/10/10(水) 11:30:08.66
grep -e --Hoge
0930名無しさん@お腹いっぱい。2012/10/10(水) 15:19:10.02
>>927-929
ありがとうございました
0931名無しさん@お腹いっぱい。2012/10/12(金) 19:22:12.36
すいません、教えてください。
at コマンドで、日付を指定することはできませんか?
4日後の午前8時に実行したいのです。
at コマンドじゃなくてもかまいません。
FreeBSD 4.7 です。
よろしくお願いします。
0932名無しさん@お腹いっぱい。2012/10/12(金) 19:35:22.65
なぜmanを読まない? 時刻と日数は違うけとそのものずばりが例にかかれてる。
0933名無しさん@お腹いっぱい。2012/10/12(金) 19:39:11.88
>>932
ありがとうございました。
8am + 4 days
で、いいんですね?
0934名無しさん@お腹いっぱい。2012/10/12(金) 20:09:51.12
>>933
日付は+1しないとダメだよ
0935名無しさん@お腹いっぱい。2012/10/23(火) 23:44:42.55
ネタ切れ
0936名無しさん@お腹いっぱい。2012/10/30(火) 14:47:21.49
すいません 教えてください。
あるMakefileの中に
変数:=XXXXX
変数+=XXXXX
の記述があるんですが、これってどう言う意味でしょうか
0937名無しさん@お腹いっぱい。2012/10/30(火) 14:57:50.73
マルチ乙
http://toro.2ch.net/test/read.cgi/unix/1079538957/
09389362012/10/30(火) 16:07:27.79
>937
だって、あちらは誰もいないみたいなんで
0939名無しさん@お腹いっぱい。2012/10/30(火) 19:36:36.28
それはスレ違いの書き込みしていい理由にはならない。
0940名無しさん@お腹いっぱい。2012/11/03(土) 22:03:05.39
makeのこときかれても.....
0941名無しさん@お腹いっぱい。2012/11/03(土) 22:57:10.70
だってワロタ
0942名無しさん@お腹いっぱい。2012/11/04(日) 10:42:30.42
chroot後に、プロンプトを変更しようとしています。
chroot /hoge export PS1="\u@\h \w->
プロンプト変更.shを作って
chroot /hoge /hoge/プロンプト変更.sh
としても、そのようなファイルやディレクトリはないと怒られます。
何故でしょうか?

0943名無しさん@お腹いっぱい。2012/11/04(日) 11:08:51.12
釣りか?
/hoge/プロンプト変更.sh は /hoge に chroot した後は /プロンプト変更.sh だろ。
0944名無しさん@お腹いっぱい。2012/11/04(日) 14:02:09.17
しかもプロンプト変更してすぐ終了するという意味不明な攻撃。
09459422012/11/04(日) 16:21:56.21
失礼しました。
プロンプト変更.shの中にエラーがありました
>942
どちらも試しておりましたが、スクリプトのエラーで分からなくなっていました。
おっしゃる通りですね
>944
こちらも試しては見ていたんですが
chroot ./hoge /bin/bash; /プロンプト変更.sh でしょうか
ただ、これもサブシェル内での変更になるのでしょうか、思うようにはなりませんでした。
chroot ./hoge /bin/bash; export PS1="->"
でもダメなので、bashrcを書き換えないとダメでしょうか?
0946名無しさん@お腹いっぱい。2012/11/04(日) 17:02:21.41
chroot云々は良く分からんが
. プロンプト変更.sh
source プロンプト変更.sh
じゃねーのか
0947名無しさん@お腹いっぱい。2012/11/04(日) 17:19:49.94
ツェル
0948名無しさん@お腹いっぱい。2012/11/04(日) 21:39:42.26
シェルの内部コマンドと外部コマンドの区別をつけないと。
0949名無しさん@お腹いっぱい。2012/11/05(月) 01:35:08.60
外部コマンドcdという一見不可思議なものもあったりするけどね。
0950名無しさん@お腹いっぱい。2012/11/05(月) 09:36:46.07
>>945
面倒だから正解教えてあげるけど、キミ、全然理解していない。
次に来るときはシェルの入門書を1000回読み返してからくるように。

chroot ./hoge /bin/bash --rcfile /プロンプト変更.sh
0951名無しさん@お腹いっぱい。2012/11/05(月) 11:07:47.92
>>949
そのディレクトリにcdが可能かどうかチェックはしたいけど
カレントディレクトリを変更したいわけじゃない、という場合に使う。
0952名無しさん@お腹いっぱい。2012/11/05(月) 11:10:09.44
>>951
それは (cd hoge) で十分。わざわざ/usr/bin/cd hogeとかする必要なし。
0953名無しさん@お腹いっぱい。2012/11/05(月) 11:51:33.94
/usr/bin/cd を使っちゃいけない理由もない。
0954名無しさん@お腹いっぱい。2012/11/05(月) 11:54:39.66
じゃあ外部コマンド版の以下のコマンドの意味のある用途は?

alias bg fg jobs unalias wait

もちろん、「文法チェック目的」以外で。
0955名無しさん@お腹いっぱい。2012/11/05(月) 11:56:21.15
>>953
/usr/bin/cd を使っちゃいけない理由:

/usr/bin/cdがインストールされていない環境で動かないのでポータビリティを損ねる。
0956名無しさん@お腹いっぱい。2012/11/05(月) 11:58:35.93
>>955
インストールされている環境でしか使わないスクリプトなら問題ない。
0957名無しさん@お腹いっぱい。2012/11/05(月) 12:18:17.16
>>954
POSIX Shell & Utilitiesに適合するため。
0958名無しさん@お腹いっぱい。2012/11/05(月) 12:26:50.85
>>957
POSIX Shell & Utilitiesに適合することは意味のある用途じゃないので不正解。
はい、やり直し
0959名無しさん@お腹いっぱい。2012/11/05(月) 12:32:15.46
意味ってお前が決めるものなのか?
0960名無しさん@お腹いっぱい。2012/11/05(月) 12:32:57.29
/usr/bin/cd って、どのパッケージに入ってるの?
うちの環境だと無いっぽいわ
0961名無しさん@お腹いっぱい。2012/11/05(月) 12:37:40.88
>>957
/usr/bin/cd だったら、「cd可能かどうかチェックする」という具体用途が一応示せる。
(苦し紛れだろうけど)

そういう具体例を聞いてるんだよ。
たとえば /usr/bin/fg って何に使うの?
プロセス変わるからジョブコンできるはずないし。
0962名無しさん@お腹いっぱい。2012/11/05(月) 12:44:25.01
実は /usr/bin/cd なんて存在しないんじゃないか?
どこにあるんだいったい・・・
0963名無しさん@お腹いっぱい。2012/11/05(月) 13:29:24.71
Solaris とか FreeBSD にはある。

http://docs.oracle.com/cd/E26924_01/html/E29112/cd-1.html
これにも>>951しか用途載ってないな。
0964名無しさん@お腹いっぱい。2012/11/05(月) 14:25:29.24
用途ないってw
>>957の通り。規格読んでみ。
builtinもexec出来ないといけないから。
0965名無しさん@お腹いっぱい。2012/11/05(月) 14:27:27.34
なんでそんな規格になってるんだろね。
0966名無しさん@お腹いっぱい。2012/11/05(月) 14:50:01.96
>>964
builtinもexec出来ないといけないからという理由なら、
trapとかsetとかのbuiltinもexec出来ないといけないことになる。
(実際にはtrapとかsetとかは外部コマンド版はない)

なぜ cdとかaliasとかは意味のない外部コマンド版があって、
trapとかsetとかには外部コマンド版がないのか、という疑問は解決しない。
0967名無しさん@お腹いっぱい。2012/11/05(月) 20:50:10.49
とりあえず文句が言いたいならOpenGroupへ。
ここで意味がないとか言っても何も解決しない。
0968名無しさん@お腹いっぱい。2012/11/05(月) 20:52:30.50
文句はないけど疑問ではある。
0969名無しさん@お腹いっぱい。2012/11/05(月) 21:44:16.98
シェルやシェルスクリプトをよく知らない人が
「builtinコマンドもexec経由で起動できるように外部コマンドを配置」
って決めちゃって、そんなの意味ないって下から指摘あったけど
決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。
だから、実用性優先のLinuxとかではそんな変な仕様には準拠せず、
/usr/bin/cdとかアホなコマンドはインストールしないようになってる。
0970名無しさん@お腹いっぱい。2012/11/05(月) 22:01:57.65
>>969
> シェルやシェルスクリプトをよく知らない人が
> 「builtinコマンドもexec経由で起動できるように外部コマンドを配置」
> って決めちゃって、そんなの意味ないって下から指摘あったけど
> 決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。
それはどこ情報?
0971名無しさん@お腹いっぱい。2012/11/13(火) 10:00:15.55
find SOME_DIR -type f -exec SOME_COMMAND {} \;
で、SOME_DIR 内に一つ見つかったら一回 SOME_COMMAND して、それで終わり、
次のファイルはもう処理しない、という方法はありますか ?
-exit とかあったような気がして man 見直したら、見当たらない…
0972名無しさん@お腹いっぱい。2012/11/13(火) 10:57:30.97
-quitの事か?
09739712012/11/13(火) 11:40:06.17
ありがとう! -quit だ。
しかし、なぜ man find に出てこないんだろう…
0974名無しさん@お腹いっぱい。2012/11/13(火) 11:42:39.49
うちの man には書いてあるけど。
0975名無しさん@お腹いっぱい。2012/11/13(火) 12:05:46.68
>>973
OSは何?
0976名無しさん@お腹いっぱい。2012/11/13(火) 12:18:32.27
GNU限定の話ってだけのこと
0977名無しさん@お腹いっぱい。2012/11/13(火) 12:22:31.28
* Copyright (c) 1991, 1993, 1994
*The Regents of the University of California. All rights reserved.
と書いてあるfindにもあるけど。
0978名無しさん@お腹いっぱい。2012/11/13(火) 12:34:55.40
ポジックス(笑)には載ってないから使っちゃ駄目
ハイ論破
0979名無しさん@お腹いっぱい。2012/11/13(火) 12:38:30.29
ポンッと押すだけでパッとつく
ハイポンパ
09809712012/11/13(火) 13:17:00.75
Mac OS 10.8.2(Mountain Lion) の /usr/bin/find 。
-quit は、効くけど、/usr/bin/man find には出てこないという…
0981名無しさん@お腹いっぱい。2012/11/13(火) 13:43:17.37
Macは知らんわ。
0982名無しさん@お腹いっぱい。2012/11/13(火) 14:51:52.16
何なら知ってる?
0983名無しさん@お腹いっぱい。2012/11/13(火) 18:55:48.29
カレーパン
0984名無しさん@お腹いっぱい。2012/11/13(火) 19:03:34.72
manも完全じゃないしな

日本語manに至っては、数年前から誤記が放置だ
0985名無しさん@お腹いっぱい。2012/11/13(火) 19:12:08.46
manはobsoleteで今後更新されないから、
今後はアンサーブックを使えって聞いたよ。
もちろん閲覧はHotJavaを使うこと。
0986名無しさん@お腹いっぱい。2012/11/13(火) 20:28:03.43
>>984
お前も放置してる1人だろ。
0987名無しさん@お腹いっぱい。2012/11/14(水) 10:18:00.47
FreeBSDの find(1)のman に -quit ないね

MacOSXもその状況をひきずっていそう
0988名無しさん@お腹いっぱい。2012/11/14(水) 11:31:26.58
.\" $FreeBSD: head/usr.bin/find/find.1 240299 2012-09-10 07:56:59Z des $
にはあるよ。いつからあるかは知らない。
0989名無しさん@お腹いっぱい。2012/11/14(水) 12:06:38.79
コードの方は2008/2、マニュアルは2012/9だな。
コメントが
Document -quit, four and a half years after it was implemented.
だと。
0990名無しさん@お腹いっぱい。2012/11/14(水) 14:08:21.73
>989
まーじーでーーー
0991名無しさん@お腹いっぱい。2012/11/14(水) 20:51:36.07
だから、そういうおかしなmanページの差し替え版を売り、サポートもするという商売が
成り立つのだよね
0992名無しさん@お腹いっぱい。2012/11/14(水) 21:39:15.28
-quit なんてのは逃げだろ。
男らしくない。
BSD にはいらん。
軟弱な Linux でも使ってろ。
0993名無しさん@お腹いっぱい。2012/11/15(木) 00:12:41.93
こうして*BSDユーザのオサーン率が高まり、犬女ばかり増殖する…。

ってか次スレ建てろよ>>980
0994名無しさん@お腹いっぱい。2012/11/15(木) 16:34:11.28
{Free,Net,Open}BSDは人がいないからドキュメント更新遅れてる。
実物より古いバージョンのままなんて日常茶飯事。
0995名無しさん@お腹いっぱい。2012/11/15(木) 18:59:46.37
なぜ動かないのでしょう?

#!/bin/sh
/usr/bin/cc $argv[1].c -o $argv[1] -lm
0996名無しさん@お腹いっぱい。2012/11/15(木) 19:28:10.21
>>995
1点。

ハイ次の方どうぞ
0997名無しさん@お腹いっぱい。2012/11/15(木) 19:30:19.71
ガッコでは動いたんやshの場所もccの場所も確認したんや...
(´・ω・`)
0998名無しさん@お腹いっぱい。2012/11/15(木) 19:41:03.39
zshでも/bin/shで起動されるとsh互換になるはずなんだがな
0999名無しさん@お腹いっぱい。2012/11/15(木) 19:43:50.00
$argv[1] って・・・
/bin/shじゃねぇのか?
C,PHP,Perlとかならおkだろうけど
shなら$1ちゃうんかい?
1000名無しさん@お腹いっぱい。2012/11/15(木) 19:45:03.49
スマソ
動いてはいるんだけども
cc:エラー:[1].c:そのようなファイルやディレクトリはありません
って怒られる...(´・ω・`)あるのに
レス数が1000を超えています。これ以上書き込みはできません。