シェルスクリプト総合 その21
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/11/15(木) 18:57:33.11□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0301名無しさん@お腹いっぱい。
2013/03/20(水) 13:30:49.450302240
2013/03/20(水) 14:17:01.940303名無しさん@お腹いっぱい。
2013/03/20(水) 14:47:31.510304名無しさん@お腹いっぱい。
2013/03/20(水) 14:56:14.39manのDBがぶっ壊れたんじゃねーの?
mandb -c
でもやっときゃ治るんじゃね?
0305名無しさん@お腹いっぱい。
2013/03/20(水) 15:54:26.54nroff -man とか -mandoc とかでは見えるのか?
0306名無しさん@お腹いっぱい。
2013/03/20(水) 16:29:00.10それは自動化するなってポリシーだろ。
0307名無しさん@お腹いっぱい。
2013/03/20(水) 16:34:18.88スレ違い
0308名無しさん@お腹いっぱい。
2013/03/20(水) 16:50:03.97そんなポリシー知ったことか
0309名無しさん@お腹いっぱい。
2013/03/20(水) 18:25:40.65ならヒアドキュメントに書けよ。
0310名無しさん@お腹いっぱい。
2013/03/20(水) 18:47:24.36で、>>308 サーバーがクソだという結論(sshの場合は)
対話が必要ってことは人間(>>308)にも使い道があるってことだよ。
なるべく減らした方が良いのは言うまでもないけど難しいね。
すれ違いだけどsshにはssh-agentとかagent forwardとかあるから
そういうことにも配慮されてる。agent forwardするとbackgroundで
動かしつつlogoutすると新規に接続できなくなるけど。
0311名無しさん@お腹いっぱい。
2013/03/20(水) 18:54:36.87ヒアドキュメントじゃ動かないよ・・・
0312名無しさん@お腹いっぱい。
2013/03/20(水) 18:56:53.20リモートでシェルコマンド実行したいときは仕方なくexpect+rlogin使ってるらしい
何を考えてそういうポリシーになってるのかは謎
0313名無しさん@お腹いっぱい。
2013/03/20(水) 19:48:21.83expectの中に書くってことだよ。
0314名無しさん@お腹いっぱい。
2013/03/20(水) 21:20:00.49どうやってサーバーサイドで公開鍵のパスフレーズ必須にできるんだよ。
0315名無しさん@お腹いっぱい。
2013/03/20(水) 21:40:52.890316名無しさん@お腹いっぱい。
2013/03/20(水) 21:45:17.550317名無しさん@お腹いっぱい。
2013/03/20(水) 21:46:23.080318名無しさん@お腹いっぱい。
2013/03/20(水) 21:47:36.650319名無しさん@お腹いっぱい。
2013/03/20(水) 21:58:29.79出来るから、それと混同してるんじゃないかな。
0320名無しさん@お腹いっぱい。
2013/03/20(水) 22:46:51.790321名無しさん@お腹いっぱい。
2013/03/20(水) 22:58:21.11もう1つ方法があるだろ、知らないのか?
0322名無しさん@お腹いっぱい。
2013/03/20(水) 23:33:19.79ないよ。
0323名無しさん@お腹いっぱい。
2013/03/20(水) 23:40:01.59バカに教えておいてやる。rfc4252で定義されている認証方式は
7. Public Key Authentication Method: "publickey"
8. Password Authentication Method: "password"
9. Host-Based Authentication: "hostbased"
の三種類。このうち公開鍵を利用した認証方式は7と9
7,9のどちらもパスフレーズは送らない。
0324名無しさん@お腹いっぱい。
2013/03/21(木) 00:14:14.882chの情強視点の正しい使い方。
0325名無しさん@お腹いっぱい。
2013/03/21(木) 00:44:29.260326名無しさん@お腹いっぱい。
2013/03/21(木) 01:09:02.59たださらに間違いを重ねてくる場合も。微妙に間違える場合も。自分で確認しろってことやね
0327名無しさん@お腹いっぱい。
2013/03/21(木) 01:29:06.00サーバサイドってか、会社のポリシーで強制してんじゃないの。
0328240
2013/03/21(木) 07:35:03.32303、304、305、307さんありがとね
ちょっと試してみます
0329名無しさん@お腹いっぱい。
2013/03/21(木) 11:34:13.490330名無しさん@お腹いっぱい。
2013/03/21(木) 19:29:52.66「会社の方針」を↓このように説明する奴は会社員失格
> From: [300] 名無しさん@お腹いっぱい。 <sage>
> Date: 2013/03/20(水) 13:11:02.19
>
> >>298
> できないサーバがあるんだよ
0331名無しさん@お腹いっぱい。
2013/03/21(木) 19:34:05.870332名無しさん@お腹いっぱい。
2013/03/21(木) 20:07:34.290333名無しさん@お腹いっぱい。
2013/03/21(木) 23:24:51.13メールで毎日ヘルスチェックレポートをメールで飛ばしたい。
SW側で smtp も pop も閉じてる。
とか、意味の分かんない要望を満たすスクリプトを組んだことがある。
世の中、変態が多いと思ったよ。
0334名無しさん@お腹いっぱい。
2013/03/22(金) 11:22:35.11鍵を使わせてもらえない
0335名無しさん@お腹いっぱい。
2013/03/22(金) 11:32:33.350336 忍法帖【Lv=8,xxxP】(1+0:8)
2013/03/23(土) 19:42:31.83[ ! -d hoge ] && mkdir hoge
これってどっちも同じ?
0337名無しさん@お腹いっぱい。
2013/03/23(土) 20:05:46.61わざわざtestしなくても mkdir hoge 2> /dev/null でいいよ。
test方式だとクリティカルパスになるから不完全だし。
0338名無しさん@お腹いっぱい。
2013/03/23(土) 20:13:10.91[[ ! -d hoge ]] の場合、hogeにワイルドカードが含まれていても展開しない。
[ ! -d hoge ] の場合はワイルドカードを展開する、という違いがある。
0339 忍法帖【Lv=8,xxxP】(1+0:8)
2013/03/24(日) 10:14:14.17なるほど!ありがとう!
0340名無しさん@お腹いっぱい。
2013/03/25(月) 00:31:16.370341名無しさん@お腹いっぱい。
2013/03/25(月) 00:47:35.180342名無しさん@お腹いっぱい。
2013/03/25(月) 04:27:54.82汎用なら使っているが。
0343名無しさん@お腹いっぱい。
2013/03/25(月) 09:11:43.16[[ は bash じゃなくて ksh 由来。
0344名無しさん@お腹いっぱい。
2013/03/25(月) 10:09:29.81それ言ったら [ も bash の機能だけど。
0345名無しさん@お腹いっぱい。
2013/03/25(月) 10:10:49.350346名無しさん@お腹いっぱい。
2013/03/25(月) 10:46:57.85cd /home/LANDISK/scripts/
cat *.sh
ってやると、バイナリファイルが混じっててビビるんですが、
あれはなんなんですか。
0347名無しさん@お腹いっぱい。
2013/03/25(月) 10:57:34.31ファイル先頭部分のみシェルスクリプトになってて、
ファイル後半にtar玉とかのバイナリが連結されてる。
シェルはバイナリ部分を読む前にexitするし、バイナリ部分をtail -n +XXX とかで
取り出すからこれで動作できる。
0348名無しさん@お腹いっぱい。
2013/03/25(月) 11:04:42.920349名無しさん@お腹いっぱい。
2013/03/25(月) 11:23:49.36setuser.sh
ELF
エディタで開くと、こんな感じです。
0350名無しさん@お腹いっぱい。
2013/03/25(月) 11:37:57.530351名無しさん@お腹いっぱい。
2013/03/25(月) 11:43:03.160352名無しさん@お腹いっぱい。
2013/03/25(月) 11:52:02.760353名無しさん@お腹いっぱい。
2013/03/25(月) 12:06:24.73bash$ file
sh: file: command not found
0354名無しさん@お腹いっぱい。
2013/03/25(月) 12:09:46.54おそらくlddコマンドもないだろうから、
LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh
してみ。動的リンクならライブラリが表示されるし、
静的なら not a dynamic executable ってなる。
0355名無しさん@お腹いっぱい。
2013/03/25(月) 12:15:56.58ありがとうございます。こうなりました。
# LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh
libc.so.6 => /lib/libc.so.6 (0x2957c000)
libnss_dns.so.2 => /lib/libnss_dns.so.2 (0x296bb000)
libnss_files.so.2 => /lib/libnss_files.so.2 (0x296cf000)
libresolv.so.2 => /lib/libresolv.so.2 (0x296e9000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x29556000)
このようなバイナリファイルが中で何をしているのか可読化するには、
どこまで可能でしょうか。
0356名無しさん@お腹いっぱい。
2013/03/25(月) 13:03:19.360357名無しさん@お腹いっぱい。
2013/03/25(月) 13:14:51.48ソースだって入手可能だった気がするが。
0358名無しさん@お腹いっぱい。
2013/03/25(月) 15:23:30.31perlで動く expect.pm 使ってね
日本語マニュアル、古いのはあったんだけど公開サーバ無くなちゃったな
どうすっかな…
0359名無しさん@お腹いっぱい。
2013/03/29(金) 22:14:00.55その相違行の違う文字の部分だけぱーっと色を付けて表示して欲しいんです
出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません
サルでも分かるようなシェルそのものの回答を強く期待します
さぁどうぞ↓
0360名無しさん@お腹いっぱい。
2013/03/29(金) 22:44:19.370361名無しさん@お腹いっぱい。
2013/03/29(金) 23:57:55.81GNUのsource-highlightとかでもいいの?
0362名無しさん@お腹いっぱい。
2013/03/30(土) 21:06:24.18二行の文字列の相違部分を目視で比較して認識でいないと
吐露していますか?
猿以下の認識能力しかないのに、猿が理解できるレベルの回答を得ても
無駄でしょうに。
0363名無しさん@お腹いっぱい。
2013/03/30(土) 22:06:33.56自分の文章(文字列)のtypoを発見できない人に言われても…
やっぱりハイライト表示あった方がいいわな
0364名無しさん@お腹いっぱい。
2013/04/01(月) 10:49:45.08できる/できない論と、効率化、処理コスト削減を同列に語ったら駄目だよ。
0365名無しさん@お腹いっぱい。
2013/04/01(月) 11:25:52.57弱いものいじめはよせ!
>>362だって一生懸命生きているんだぞ!
0366名無しさん@お腹いっぱい。
2013/04/02(火) 00:19:37.72涙拭けよ
0367名無しさん@お腹いっぱい。
2013/04/07(日) 21:03:01.88教えてください。
sh=${SH:-/bin/bash}
と言う処理の
:-
ってどういう意味でしょうか?
0368名無しさん@お腹いっぱい。
2013/04/07(日) 21:20:47.08似たのがいろいろあるからman shした方が良い。
:-は「Use Default Values.」$SHだけど$SHがunset or nullなら/bin/bashになる。
0369名無しさん@お腹いっぱい。
2013/04/07(日) 21:24:34.440370名無しさん@お腹いっぱい。
2013/04/07(日) 21:24:43.66http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
0371名無しさん@お腹いっぱい。
2013/04/07(日) 21:25:16.12bashに限らない。
0372名無しさん@お腹いっぱい。
2013/04/07(日) 21:31:29.010373名無しさん@お腹いっぱい。
2013/04/07(日) 21:36:24.430374名無しさん@お腹いっぱい。
2013/04/07(日) 21:45:17.21そしてこれは否定的でない回答です
0375名無しさん@お腹いっぱい。
2013/04/07(日) 21:46:56.83「もし!」って強調してるんですか?
0376名無しさん@お腹いっぱい。
2013/04/07(日) 22:00:51.300377名無しさん@お腹いっぱい。
2013/04/08(月) 01:04:46.200378名無しさん@お腹いっぱい。
2013/04/08(月) 06:23:01.14そう思うのはおまえのスキルの問題、もっと勉強しましょう
zshを極めた俺は腹抱えた笑ったぞ
HAHAHAHAHAHA
0379名無しさん@お腹いっぱい。
2013/04/08(月) 08:57:53.240380名無しさん@お腹いっぱい。
2013/04/08(月) 13:54:30.20つまらんものにつまらんってマジレスしちゃうバカは救いようがない
0381名無しさん@お腹いっぱい。
2013/04/08(月) 13:58:20.19ってマジレスしちゃうバカは救いようがない
0382名無しさん@お腹いっぱい。
2013/04/08(月) 14:05:52.15つまらんものはつまらんと言っとかないといかんでしょ。
おもしろいと勘違いしたまま書き続けられたらたまらん。
0383名無しさん@お腹いっぱい。
2013/04/08(月) 14:27:38.890384名無しさん@お腹いっぱい。
2013/04/08(月) 17:23:40.16本当につまらんならつまらんとか書いちゃいかんでしょ。
「つまらん」の反応が欲しくて書き続けるから。
0385名無しさん@お腹いっぱい。
2013/04/08(月) 17:24:20.771回は言っとかないと。
それでやめないようならもうしょうがない。
0386名無しさん@お腹いっぱい。
2013/04/08(月) 17:52:19.80つまらないなら自分が面白いことを書けばいいんでね?
つまらん だけ書いても誰も同意しねえよ
0387名無しさん@お腹いっぱい。
2013/04/08(月) 18:23:14.760388名無しさん@お腹いっぱい。
2013/04/08(月) 18:45:53.940389名無しさん@お腹いっぱい。
2013/04/08(月) 20:32:40.68hoge=`command1 | command2`
としたときにcommand1,command2の返り値を得たいのですがどうすれば良いのでしょう。
${PIPESTATUS[@]}にはcommand2の返り値しか入らないようで。
うーむ。
0390名無しさん@お腹いっぱい。
2013/04/08(月) 20:47:34.14その返り値が親シェルのPIPESTATUS[@]に入るから、親から見たコマンドはひとつしかないので値はひとつ。
0391名無しさん@お腹いっぱい。
2013/04/08(月) 20:52:27.520392名無しさん@お腹いっぱい。
2013/04/08(月) 20:58:57.19hoge=$1
echo $2 # command1の返り値
echo $3 # command2の返り値
…じゃ駄目か
0393名無しさん@お腹いっぱい。
2013/04/08(月) 21:09:03.190394名無しさん@お腹いっぱい。
2013/04/08(月) 22:06:41.78解答ありがとうございます。
>>391 >>393
の失礼な方は私ではありません。
0395名無しさん@お腹いっぱい。
2013/04/08(月) 23:18:36.07素直にこれじゃいけないの。
hoge=$(command1)
fuga=$(echo $hoge|command2)
0396名無しさん@お腹いっぱい。
2013/04/08(月) 23:28:03.96他のbashスクリプトを見てますけど、例外処理って一部しかしていない。
そんなものですか?
0397名無しさん@お腹いっぱい。
2013/04/09(火) 05:19:45.47command1が失敗したら終了させるには pipefail で十分だし
一個でも処理が失敗したら終了させるには set -e でいい
>>396の想像する完璧な例外処理とスクリプトのスマートさってのは良く分からんが
少なくともtry...catchみたいなのが言語に用意されていない以上すっきりした解決策はないんじゃなかろうか
まあ普通のプログラミング言語でも必要になるのは最後の例外だけで
PIPESTATUS全てが必要になることなんて滅多にないんだが
0398名無しさん@お腹いっぱい。
2013/04/09(火) 07:29:49.70PIPESTATUSにはhoge=の結果、すなわち変数hogeへの代入の終了ステータスが入る。
hoge=`command1 | command2; echo ${PIPESTATUS[@]} >file`
でfileから読める。
0399名無しさん@お腹いっぱい。
2013/04/09(火) 08:44:52.500400名無しさん@お腹いっぱい。
2013/04/09(火) 09:03:27.73■ このスレッドは過去ログ倉庫に格納されています