シェルスクリプト総合 その6
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001うはwwwww
2006/03/26(日) 00:56:22スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0847名無しさん@お腹いっぱい。
2006/08/06(日) 00:45:02(1)先頭に
#!/bin/sh
のように陽にshellのmagicを書いておいて、
(2)CGIやPHPが動くときのuser id での実行許可をたてて、
(3)system()やexec()を呼ぶ。スクリプトのパスは原則フルパスで。
0848名無しさん@お腹いっぱい。
2006/08/06(日) 00:46:03ちょw
0849847
2006/08/07(月) 03:14:470850名無しさん@お腹いっぱい。
2006/08/07(月) 03:36:41(2) CGI鯖のあるプロバイダに接続
(3) 鉄定規をF5キーの箇所に置き、ハイパーオリンピックの要領で弾く
(4) 頃合いを見て80番ポートからログイン
(5) 自分のディレクトリの実行許可を書き換え
(6) /bin/shを実行
0851名無しさん@お腹いっぱい。
2006/08/07(月) 03:54:34CGIとPHPが一緒くたな時点で「ちょw」
CGIは文字通りインターフェースだから、シェルスクリプト自体を直接実行できるのをわるれるな。
0852名無しさん@お腹いっぱい。
2006/08/07(月) 09:06:470853名無しさん@お腹いっぱい。
2006/08/11(金) 23:09:46a:~
となるのに、
% a=a:~
% echo $a
a:/home/giko
となるのはなぜですか?
0854名無しさん@お腹いっぱい。
2006/08/11(金) 23:44:490855名無しさん@お腹いっぱい。
2006/08/12(土) 00:27:260856名無しさん@お腹いっぱい。
2006/08/12(土) 00:43:01NetBSD の sh と zsh でそうなりました。
0857名無しさん@お腹いっぱい。
2006/08/12(土) 00:57:13$ export a=a:~
このふたつの違いを考えてみるとわかる。
~ がコマンド引数の一部なのか、変数代入文なのか。
0858名無しさん@お腹いっぱい。
2006/08/12(土) 01:16:36どっちの echo $a の結果は同じなのですが…
0859名無しさん@お腹いっぱい。
2006/08/12(土) 01:34:160860名無しさん@お腹いっぱい。
2006/08/12(土) 01:35:050861名無しさん@お腹いっぱい。
2006/08/12(土) 16:04:100862名無しさん@お腹いっぱい。
2006/08/12(土) 16:44:30てことがしたくて変数代入のときだけ小細工してるから
0863名無しさん@お腹いっぱい。
2006/08/12(土) 19:24:24After alias substitution is performed, each word is checked to see if it begins with an unquoted ~. For tilde substitution, word
also refers to the word portion of parameter expansion (see ParameterExpansion below). If it does, then the word up to a / is
checked to see if it matches a user name in the password database (often the /etc/passwd file). If a match is found, the ~ and
the matched login name are replaced by the login directory of the matched user. If no match is found, the original text is left
unchanged. A ~ by itself, or in front of a /, is replaced by $HOME. A ~ followed by a + or - is replaced by the value of $PWD and
$OLDPWD respectively.
In addition, when expanding a variable assignment, tilde substitution is attempted when the value of the assignment begins with
a ~, and when a ~ appears after a :. The : also terminates a ~ login name.
つまり普通はワードの先頭が~のときしかtilde substitutionが行われないが、変数代入のときだけは:の後でもやる
というわけね。これはいかにも知ってないと混乱しそうな仕様だな。便利は便利なのだろうが。
0864名無しさん@お腹いっぱい。
2006/08/12(土) 22:10:32このような書き方を良く見かけるんだが、2行に分けず
1行にまとめて書いてるのは、何か技術的な理由があるの?
それとも、ただ単に行の節約とか見やすさを考慮しただけ?
0865名無しさん@お腹いっぱい。
2006/08/12(土) 22:20:560866名無しさん@お腹いっぱい。
2006/08/12(土) 22:39:34このような書き方を良く見かけるんだが、2行に分けず
1行にまとめて書いてるのは、何か技術的な理由があるの?
それとも、ただ単に行の節約とか見やすさを考慮しただけ?
0867名無しさん@お腹いっぱい。
2006/08/12(土) 22:47:220868名無しさん@お腹いっぱい。
2006/08/17(木) 16:30:16基準時点 (UTC の 1970 年 1 月 1 日 00:00:00; time(3) 参照) からの秒数
に変換するスマートなやりかた教えて
0869名無しさん@お腹いっぱい。
2006/08/17(木) 16:40:48date -u +%s -d 20060817
0870名無しさん@お腹いっぱい。
2006/08/17(木) 16:42:311155740400
0871名無しさん@お腹いっぱい。
2006/08/17(木) 16:42:49date -j -f "%Y%m%d%H%M%S" 20060817000000 +%s
0872名無しさん@お腹いっぱい。
2006/08/17(木) 16:42:50date +%s -d 20060817
0873名無しさん@お腹いっぱい。
2006/08/17(木) 17:23:45・その文法しか知らないから
・その文法をサポートしている OS でしか動かす予定がないから
・その文法をサポートしてない /bin/sh を持つ OS への嫌がらせ
のいずれか
0874名無しさん@お腹いっぱい。
2006/08/17(木) 17:28:15で、>>864 は、>>866 的な exportと代入を同時にやる bash依存文法に反対する意味をこめて
あえて1行で書いてるんだと思う。
でも、俺的には
HOGE=hoge
HAGE=hage
export HOGE HAGE
↑の書き方が好み。
0875868
2006/08/17(木) 18:07:27869,870は無理だった
871でおk FreeBSD
0876名無しさん@お腹いっぱい。
2006/08/17(木) 18:17:31export VAR=value
をbash依存文法とする根拠を述べよ。
0877名無しさん@お腹いっぱい。
2006/08/17(木) 18:34:09「bashで使えて Bourne shで使えないから」そのままやん。
先に言っとくと、*BSDのsh=ash≠Bourne shだからね。
0878名無しさん@お腹いっぱい。
2006/08/17(木) 18:37:17やれやれ。最近は export VAR=value がbash依存文法であることも知らない新参者が多いのう。
0879名無しさん@お腹いっぱい。
2006/08/17(木) 18:48:280880名無しさん@お腹いっぱい。
2006/08/17(木) 19:50:30bash依存というより、ksh依存といった方が正しい。
0881名無しさん@お腹いっぱい。
2006/08/17(木) 20:06:58立場をわきまえないと。
0882名無しさん@お腹いっぱい。
2006/08/17(木) 22:22:58"export var=value"という書き方はPOSIXシェルで有効な文法で、
bash依存の仕様と言うわけではない。
SolarisではkshはPOSIXとの互換性を使いたい場合のシェルで、
/bin/shは上記文法を受け付けず、POSIXに準拠しない。
0883名無しさん@お腹いっぱい。
2006/08/18(金) 00:24:41POSIXくらいは確認してから書こうな。テンプレにも入れてあるんだし。
0884名無しさん@お腹いっぱい。
2006/08/18(金) 00:47:04POSIXよりも、「/bin/shで使える文法かどうか」の方が重要。
0885名無しさん@お腹いっぱい。
2006/08/18(金) 01:17:060886名無しさん@お腹いっぱい。
2006/08/18(金) 02:45:19だから確実性が最優先だし、選択肢が存在すると考えること自体が間違い。
/bin/shが何者か分からなければ、bourne shellサポート範囲内かつbash拡張範囲外で書くべき。
POSIXシェルでなければならない理由が本当にあるかどうか分からないが、
もし仮に本当に必要ならば明示的に指定して使ってやればいいんだよ。
/bin/bashや/bin/xpg4/sh(Solaris)や/bin/ksh(Solaris)が存在するなら
ベンダが保証したPOSIXシェルとして使えるんだから、
何者か分からない/bin/shをおっかなびっくり使うよりマシ。
0887名無しさん@お腹いっぱい。
2006/08/18(金) 07:39:230888名無しさん@お腹いっぱい。
2006/08/18(金) 07:57:410889名無しさん@お腹いっぱい。
2006/08/18(金) 08:11:18Linux(の多くのディストロ)は標準をbashと決めているから、そういうものとして理解すればいいが、
*BSDの/bin/shはそれぞれで勝手に拡張されているし、バージョンによってコロコロ変わってたりするから、
わかりにくい。
0890名無しさん@お腹いっぱい。
2006/08/18(金) 08:14:410891名無しさん@お腹いっぱい。
2006/08/18(金) 08:31:30やはり/bin/shで何とかするのが心意気というものであろう
0892名無しさん@お腹いっぱい。
2006/08/18(金) 11:31:480893名無しさん@お腹いっぱい。
2006/08/18(金) 17:59:00でも設定出来るのになんでセミコロン入れるんだろ?
0894名無しさん@お腹いっぱい。
2006/08/18(金) 18:05:10古いシェルだと、内部コマンドに対して HOGE=hoge のような変数の指定が
うまく動作しないものがある。だから ; を入れるのが吉。
0895名無しさん@お腹いっぱい。
2006/08/18(金) 18:10:06exportという1コマンドに対してのみ一時的に HOGE=hogeという環境変数を設定する、
という動作が本来の仕様なのだから、
HOGE=hoge export HOGE (セミコロンなし)でもexportできてしまう方がバグと思われる。
(古いシェルの動作が正しい)
たとえば、
HOGE=hoge printenv HOGE
だと、printenvコマンドではhogeが表示されるが、
その後はHOGEは未設定になる動作が正しい。exportでもそうなるべきだ。
0896名無しさん@お腹いっぱい。
2006/08/19(土) 05:48:58うちは昔からこうやってるなんて言いだす傲慢さは無い。
最古参のBSDは困ったちゃん。
0897名無しさん@お腹いっぱい。
2006/08/19(土) 08:01:41LinuxはPOSIXに準拠してないよ。拠り所は GNU。
GNUの独自拡張だろうが、GNUで使えれば事実上の標準になってる。
0898名無しさん@お腹いっぱい。
2006/08/19(土) 09:03:50そういって、95年当時にLinusが事務処理にはWindowsを使っ
ていたことは公然の秘密だ。
0899名無しさん@お腹いっぱい。
2006/08/19(土) 09:18:08POSIX準拠なのはLinuxだけじゃないし、opengroupのUNIX認証を通ってないから
結局のところPOSIX準拠であることを第三者に証明できない。
優等生ってのは言い過ぎじゃないかなあ。
>>897
「GNUで使えれば」ってどういう意味よ? 説明してみて。
0900名無しさん@お腹いっぱい。
2006/08/19(土) 14:21:52UNIX認証を受けてない、メンバーにも入れてもらえない。
もしUNIX認証を受けるにしてもデストリごどになる。
linuxにUNIXを実装する事自体は容易、ほぼそのままでもいけるか。
現状はlinuxである方が有理なのでUNIX認証にはあまり興味が無い。
linuxはlinux認証を立ち上げた。
0901名無しさん@お腹いっぱい。
2006/08/20(日) 00:57:46exportが、値を何というか環境に担ぎ出して固定する
ようなイメーヅだと思えば不思議じゃない。
$ HOGE=hoge HOGE=hoge
とやった後にHOGE=hogeに設定される、
そういう効果をもともと持つコマンドがexportってこと。
0902名無しさん@お腹いっぱい。
2006/08/20(日) 03:54:31> もしUNIX認証を受けるにしてもデストリごどになる。
ほほう、UNIX認証を受けたLinuxディストリビューションが
1つでも存在するのならば知りたいものだね。興味がある。
で、「Linux認証」なるものが仮に標準たりうるとしても、
それは>>896の言う「BSDの権威」とどう違うのよ?という話。
0903名無しさん@お腹いっぱい。
2006/08/20(日) 13:15:370904名無しさん@お腹いっぱい。
2006/08/20(日) 14:05:04たぶん失敗する、なんら権威の根拠とはならないだろう。
今linuxにおける権威はRedHat、Debian、Fedora、そしてリーナスである。
一見上層に見える色々なlinux関連団体は実はなんら支配力も実効力も持っていない。
Fedoraを怒らせたらStallmanだって追放されるだろうよ。
StallmanはFedoraを抱き込んでxFree86を追放した、そういう権力構造。
>>902
その前にunixの会員になるのにいくら金積めばいいのか教えてくれ。
0905名無しさん@お腹いっぱい。
2006/08/20(日) 15:48:52追放が可能なためには、まずは所属してないと。
0906名無しさん@お腹いっぱい。
2006/08/20(日) 20:10:26UNIX認証とは違う話をしているようだけど、
「unixの会員になる」というのが何を指すのか説明して。
>>905
彼の妄想世界では可能なんだよ、きっと。
0907名無しさん@お腹いっぱい。
2006/08/21(月) 08:35:36「-行数」をデフォルトで受け付けたりやめたりとずいぶん揺れてるね。
このへんはPOSIX 1003.2-1992かPOSIX 1003.1-2001かで違うみたいだ。
0908名無しさん@お腹いっぱい。
2006/08/21(月) 09:34:220909名無しさん@お腹いっぱい。
2006/08/21(月) 15:45:35きっと美容院のことだよ。
ご紹介システムを利用すれば、1000円分のポイントもらえるよ。
0910名無しさん@お腹いっぱい。
2006/08/21(月) 16:12:59レンタル・ビデオ屋UNIXの会員になるってことじゃないかな。
0911名無しさん@お腹いっぱい。
2006/08/21(月) 16:24:16そのexportの解釈でもちょっと苦しいね。
あと、別の例だけど、
$ HOGE=hoge unset hoge
$ echo $HOGE
hoge
↑unsetされてない。
これはどう解釈する?
やっぱバグだろ。
0912911
2006/08/21(月) 16:35:48$ HOGE=hoge unset HOGE
$ echo $HOGE
hoge
この現象が起きるのはシェルの種類によるかも。
もちろん、セミコロンを入れて
$ HOGE=hoge; unset HOGE
ならちゃんと unsetされる。
何が言いたいかというと、元の話題の HOGE=hoge; export HOGE の時、
念のためセミコロンを入れろということ。
0913名無しさん@お腹いっぱい。
2006/08/21(月) 21:25:46その言い方からすると、そのウンコシェルでもexportは効くんでしょ?
0914名無しさん@お腹いっぱい。
2006/08/22(火) 13:34:42ウチの近くに本当にunixっていうレンタルやがあるぞ。
0915名無しさん@お腹いっぱい。
2006/08/22(火) 13:52:53もちろん実在することを知っているからこそ書いてる。
0916名無しさん@お腹いっぱい。
2006/08/22(火) 20:36:310917名無しさん@お腹いっぱい。
2006/08/23(水) 00:31:55標準出力に数値を出力するプログラムがあり、その値を
シェルでexitしたいんですが、マイナス値でエラー"番号が正しくありません"になります。
簡単にいうと、エラーとなるのは↓のようなものです。
#/bin/sh
EXITVALUE=-1
exit ${EXITVALUE}
これ、Linuxではうまくいくんですが、Solarisではだめなんでしょうか?
0918名無しさん@お腹いっぱい。
2006/08/23(水) 00:36:290919名無しさん@お腹いっぱい。
2006/08/23(水) 01:12:450920名無しさん@お腹いっぱい。
2006/08/23(水) 07:21:59Linuxというより、bashだと exitの値に勝手に mod 256をとった上で
符号なし8bitとみなした 0 〜 255の値になる模様。
なので、Solarisでもbashを使えば無問題。
あるいは、exit `expr \( ${EXITVALUE} + 256 \) % 256` かな。
0921名無しさん@お腹いっぱい。
2006/08/23(水) 08:04:38ありがとう。
今日環境使えたら試してみます。
0922名無しさん@お腹いっぱい。
2006/08/23(水) 08:35:250923名無しさん@お腹いっぱい。
2006/08/23(水) 09:21:27そのコマンドが返した値の-1ではなくてmod 256した値の255に変化してしまうのだが、
それでいいのかね?
0924名無しさん@お腹いっぱい。
2006/08/23(水) 09:43:03`` で受けてる。
実際には、フォーマットが決まってるから、その後awkで切り出して、
それをEXITVALUEに代入しているけど。
で、その値がマイナスだとexitで怒られます。
>>922
呼び出し側は専用のアプリで、singned charとして扱っているから大丈夫だと
思われます。
0925917
2006/08/24(木) 00:21:43今思えば質問も的を得ていないにもかかわらず、望んでいたのは
そういうレスでした。おかげでなんとかしのげました。
ありがとうございます。
他にもレスくれた人達、ありがとう!
0926名無しさん@お腹いっぱい。
2006/08/24(木) 00:29:02○ 的を射る
○ 当を得る
○ 要を得る
0927名無しさん@お腹いっぱい。
2006/08/26(土) 09:38:02Shell (as a programming language for more than trivial scripting) is dead.
シ ェ ル は 死 ん で い る
0928名無しさん@お腹いっぱい。
2006/08/26(土) 10:55:13ラリーウォールがperlの広告してる、ふう、それだけのこと
0929名無しさん@お腹いっぱい。
2006/08/26(土) 17:06:11認めてしまっている罠
0930名無しさん@お腹いっぱい。
2006/08/28(月) 10:44:12自分のメールアドレスにお知らせしてくれるリマインダーを書きたいんだけど、
どっから手を付けていいのやら。
0931名無しさん@お腹いっぱい。
2006/08/28(月) 10:50:230932名無しさん@お腹いっぱい。
2006/08/28(月) 20:59:480933名無しさん@お腹いっぱい。
2006/08/29(火) 05:35:33Google Calendar
0934名無しさん@お腹いっぱい。
2006/08/30(水) 15:21:50[1]+ Done kterm
を表示させなくするにはどうすればいいんでしょうか?
0935名無しさん@お腹いっぱい。
2006/08/30(水) 15:25:590936名無しさん@お腹いっぱい。
2006/08/30(水) 15:30:100937名無しさん@お腹いっぱい。
2006/08/30(水) 15:34:30(command &) みたいに、サブシェルを1段かましてバックグラウンドにする。
>>935 >>936 氏ね。
0939名無しさん@お腹いっぱい。
2006/08/30(水) 15:58:36bash だと、&! や、&| って無いのかな?
0940名無しさん@お腹いっぱい。
2006/08/30(水) 16:11:29disownだと、bashを含む一部のシェルのみに依存した方法になるから、
ashでも使える >>937 を尊重したい。
0941名無しさん@お腹いっぱい。
2006/08/30(水) 16:22:59disownだと、コマンド起動直後の [1] 1234 みたいなジョブ/プロセス番号の
表示までは消せない、という話しもある。
&! は zsh依存だな。
0942名無しさん@お腹いっぱい。
2006/09/01(金) 01:16:16簡単に捕まえる方法ってありますか?
hogehoge 2>&1 | less
とか打つの面倒なので、
hogehoge |& less
とcsh系のみたいな簡略系がないかなと思うんですが。cshは
あらゆるところがヘボイけど、これだけはうれしい。zsh使え?
0943名無しさん@お腹いっぱい。
2006/09/01(金) 06:47:08画面に表示するだけなら、2>&1はいらないわけだが。
0944名無しさん@お腹いっぱい。
2006/09/01(金) 08:07:00自分で答え書いてるけど、zsh使えばいいんじゃない。
ちなみに、オレは hoge 2>&1 | less と打つのが苦にならない(もう指が覚えてる)。
0945名無しさん@お腹いっぱい。
2006/09/01(金) 08:46:07マンドイってたった2文字の差じゃ‥‥
0946名無しさん@お腹いっぱい。
2006/09/01(金) 09:29:16漏れも同じ。zshでも2>&1って打ってることが多い。
これより101キーバインドと106/109キーバインドの差の方が引っかかりやすい。
レス数が900を超えています。1000を超えると表示できなくなるよ。