シェルスクリプト総合 その5
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2006/01/21(土) 09:00:29スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0303名無しさん@お腹いっぱい。
2006/02/22(水) 18:55:06find . -type l -exec sh -c '[ -e "{}" ] || echo "{}"' ';'
0304名無しさん@お腹いっぱい。
2006/02/22(水) 18:57:31#! /bin/sh
ls -L "$1"
if [ $? -ne 0 ]; then
echo "$1"
fi
をxargsで-0 -n 1だな。
0305名無しさん@お腹いっぱい。
2006/02/22(水) 19:11:33「ここで質問する時は敢えて『シェルを書く』と言うと、回答の食いつきが良い」
急ぎで回答を得たい場合にもお勧め。
φメモメモ。
0306名無しさん@お腹いっぱい。
2006/02/22(水) 19:15:06使ってるのは何故だか、理解してる?
知らなくても問題ない。man xargsだ。
0307名無しさん@お腹いっぱい。
2006/02/22(水) 19:31:57ほのめかし厨さん
0308名無しさん@お腹いっぱい。
2006/02/22(水) 19:46:57-execがあるだろうとかそんなことでしょ。
けどエスケープやエクスパンジョンの泥沼にはまるくらいなら、
xargsはええと思うで。stdinからexecveまでshellを介さんから。
特に空白や日本語や特殊文字のパス名が多い昨今は。
0309295
2006/02/22(水) 19:48:22↓これで一発です。
for file in *; do [ -h "$file" -a ! -e "$file" ] && echo "$file"; done
findなどの外部コマンドは使いませんし、
スペース入りファイル名の問題もありません。
釣られて回答をくれた皆さん、釣りには気をつけましょう。
0310名無しさん@お腹いっぱい。
2006/02/22(水) 20:24:03ln -s /nonexistent .詰めが甘いな坊や
0311名無しさん@お腹いっぱい。
2006/02/22(水) 20:34:32どう詰めが甘いの?
ln -s /nonexistent . でも、期待通り動作するけど。
0312名無しさん@お腹いっぱい。
2006/02/22(水) 20:51:430313名無しさん@お腹いっぱい。
2006/02/22(水) 21:01:00なんだそんなことか。
.で始まるファイルはここでは問題になってないので、、、
必要なら for file in * .* にすればいいだけだし。
0314名無しさん@お腹いっぱい。
2006/02/22(水) 21:03:30仕様後付けで「期待通り」なんて言っているから坊やなんだよ。
0315名無しさん@お腹いっぱい。
2006/02/22(水) 21:10:01メインであって、それ以外の部分は参考でしかない。(仕様のあと付けではない)
>>310 みたいな突っ込みは本筋以外の部分に突っ込んでるので、
突っ込みとしても、釣りとしても面白くない、詰まり詰めが甘い。
0316名無しさん@お腹いっぱい。
2006/02/22(水) 21:15:530317名無しさん@お腹いっぱい。
2006/02/22(水) 21:19:510318名無しさん@お腹いっぱい。
2006/02/22(水) 21:27:23今度はどんなシェルを書きたいのですか?
0319名無しさん@お腹いっぱい。
2006/02/22(水) 21:32:38引っ掛け問題なので、それ以外の部分は障害物でしかない。(仕様のあと付けではない)
0320名無しさん@お腹いっぱい。
2006/02/22(水) 21:38:200321名無しさん@お腹いっぱい。
2006/02/22(水) 22:20:27それとも、犬の馬鹿が乱入して吠えてるというのは僕の妄想であって、
本当はUNIX板の住人がこうして基地外みたいに吠えてるのでしょうか?
0322名無しさん@お腹いっぱい。
2006/02/22(水) 22:34:340323名無しさん@お腹いっぱい。
2006/02/22(水) 22:42:150324名無しさん@お腹いっぱい。
2006/02/23(木) 00:04:24このスレの馬鹿は半分しか減らないよ。
0325名無しさん@お腹いっぱい。
2006/02/23(木) 00:09:18すぐに犬糞とか言い出すヤツ。何なのアレ?
0326名無しさん@お腹いっぱい。
2006/02/23(木) 00:12:380327あい
2006/02/23(木) 20:28:26それとAIXのdateコマンドを使用して二ヶ月前の日付を取得できないでしょうか?
0328名無しさん@お腹いっぱい。
2006/02/23(木) 20:51:38find で -ctime とか -mtime 指定したんじゃまずいのか?
0329名無しさん@お腹いっぱい。
2006/02/23(木) 21:28:292ヶ月前の日付は、TZいじって、
TZ=JST+1431 date でできない?
できなきゃあきらめて GNU dateを入れて date -d '2 months ago'
0330名無しさん@お腹いっぱい。
2006/02/24(金) 09:26:45getentコマンドはSolarisにもあるよ。他のOSでは未確認だけど、
OS依存性を小さくしたいのならgetentでいいんじゃない?
IPv6を設定しているような変態ホストは無視しても問題なし。
0331名無しさん@お腹いっぱい。
2006/02/24(金) 09:47:362 host -t aで引く(IPv4オンリー、ラウンドロビン)
1がIPv6なら、2のみ
それ以外、1と2をmerge&uniq
ってスレ違いじゃねえ?
0332名無しさん@お腹いっぱい。
2006/02/25(土) 00:40:49OpenSSLの自己証明書を作成するときなど
自己証明の入力を促されますが
シェルスクリプトで自動で入力するようにしたいです。
どうやったらできるでしょうか?
ご教授よろしくお願いします。
0333名無しさん@お腹いっぱい。
2006/02/25(土) 00:56:49expectスクリプトだな。
0334名無しさん@お腹いっぱい。
2006/02/25(土) 01:00:37> 自己証明の入力を促されますが
何言ってんだか分からないが、引数で渡せないのか?
それともバカチョンスクリプト、CA使ってんの? 自分でやれ
0336名無しさん@お腹いっぱい。
2006/02/25(土) 01:18:550337名無しさん@お腹いっぱい。
2006/02/25(土) 01:40:37Ctrl-C Ctrl-V
0338332
2006/02/25(土) 01:53:50expect勉強して、testuserのパスワード変更スクリプト作ったのですがうまくいきません。
#!/bin/sh
USER=testuser
PASSWD=testpass
expect -c "
set timeout 20
spawn passwd $USER
expect \"New UNIX password:\"
send \"$PASSWD\r\"
expect \"Retype new UNIX password:\"
send \"$PASSWD\r\"
"
これを実行すると何もエラーなく終了するのに
パスワードは変わってません。
どこか間違ってるでしょうか?
よろしくお願いします。
0339名無しさん@お腹いっぱい。
2006/02/25(土) 02:07:230340名無しさん@お腹いっぱい。
2006/02/25(土) 02:17:33>>337は実行したのか?
0341名無しさん@お腹いっぱい。
2006/02/25(土) 08:35:39「強制終了」と、「コントロールコード1字入力」が、
この文脈で何か関係あるのか?
0342名無しさん@お腹いっぱい。
2006/02/25(土) 09:43:130343332
2006/02/25(土) 10:23:13expect -c "
set timeout 20
spawn passwd testuser
expect "*password*"
send "test"
expect "*password*"
send "test"
"
expect使ったことないのでよくわからないのですが、こんな感じですよね?
でもこれ実行してもパスワード変わってないのです。
どなたか、ご教授よろしくお願いします。
0344名無しさん@お腹いっぱい。
2006/02/25(土) 10:43:490345名無しさん@お腹いっぱい。
2006/02/25(土) 23:26:59user $
みたいに&付ければ作ったスクリプトを常駐できるのですが、
&なしで
user $ test.sh
user $
のように&なしで常駐するようなスクリプトはどう書けばいいのですか?
0346名無しさん@お腹いっぱい。
2006/02/25(土) 23:32:04スクリプトの中で & を付けてコマンドを起動すればいいだけ。
コマンドが複数ある場合は、( ) で囲って最後に &
↓みたいな感じ
(
command1
command2
:
:
) &
0347名無しさん@お腹いっぱい。
2006/02/25(土) 23:43:53素早い解答ありがとうございます。
0348名無しさん@お腹いっぱい。
2006/02/26(日) 10:50:210349名無しさん@お腹いっぱい。
2006/02/26(日) 12:33:090350名無しさん@お腹いっぱい。
2006/02/26(日) 12:37:53常駐=daemonという意味なら、むしろわざわざfork()して、
その親が先にexit()するというお決まりのプロセスを踏むのが普通。
ttyやプロセスグループを切り離すためにね。
0351名無しさん@お腹いっぱい。
2006/02/26(日) 13:31:140352名無しさん@お腹いっぱい。
2006/02/26(日) 14:13:040353名無しさん@お腹いっぱい。
2006/02/26(日) 14:33:07>>351
セッションリーダーであるプロセスって概念はない。
あるプロセスのpidがプルセスグループidになったり、
セッションIDになることがあるだけ。
0354名無しさん@お腹いっぱい。
2006/02/26(日) 16:55:21は?
0355名無しさん@お腹いっぱい。
2006/02/26(日) 18:55:50特定の日付のタイムスタンプのファイルを探すシェルはどう書けばいいですか?
0356名無しさん@お腹いっぱい。
2006/02/26(日) 19:18:381日前なら find . -ctime 1
2日前なら find . -ctime 2
あとはお好みで。 -type f とか。詳しくは man findをどぞ。
0357名無しさん@お腹いっぱい。
2006/02/26(日) 19:21:28質問をよく読みましょう。試験とかで早合点してケアレスミスするタイプかな?
ちなみに、findでは簡単な方法はないと思うよ。
0358名無しさん@お腹いっぱい。
2006/02/26(日) 19:23:000359名無しさん@お腹いっぱい。
2006/02/26(日) 19:34:30Cでもなんでも好きな言語使え。
0360名無しさん@お腹いっぱい。
2006/02/26(日) 19:48:480361名無しさん@お腹いっぱい。
2006/02/26(日) 20:06:490362名無しさん@お腹いっぱい。
2006/02/26(日) 20:11:51今日も来たね。待ってたよ。
0363名無しさん@お腹いっぱい。
2006/02/26(日) 20:15:01それをfindに食わせればいいのかな?
GNU dateなら何とかなりそう。でもめんどくさそう。俺はパス。
0364名無しさん@お腹いっぱい。
2006/02/26(日) 20:35:00touch -t 日付 /tmp/start
touch -t その翌日 /tmp/end
find . -newer /tmp/start \! -newer /tmp/end -print
0365名無しさん@お腹いっぱい。
2006/02/26(日) 20:43:17「その翌日」をどうやって求めるんだよ。
結局dateを使う方法の方が奇麗では? テンポラリファイルも要らないし。
0366名無しさん@お腹いっぱい。
2006/02/26(日) 21:29:000367332
2006/02/26(日) 21:34:32expect -c "
set timeout 20
spawn passwd testuser
expect "*password:"
send "test\r"
expect "*password:"
send "test\r"
"
何度もすみません。
これ実行してもパスワード変更されません。
なぜ教えていただけないのかもわかりません。
難しすぎてわからないから教えていただけない?
簡単すぎてバカらしいから教えていただけない?
どちらなのでしょうか?
よろしければ、expectの使い方おしえてください。
よろしくおねがいします。
0368名無しさん@お腹いっぱい。
2006/02/26(日) 21:39:43↓ほれ。こんなんでどう?
arg=2005-01-23 # 探したい日付
days=`expr \( \`date +%s\` - \`date +%s -d $arg\` \) / 60 / 60 / 24`
find . -daystart -mtime $days
↑ ` ` が2重にネスティングしてるので注意してね。
0369名無しさん@お腹いっぱい。
2006/02/26(日) 22:04:38:-P
まずね、""(ダブルクオーテーション)の中で"(ダブルクオーテーション)を使うなら
\(バックスラッシュ)をその前につけろ。わかったら一度市ね。
エラーメッセージくらいかけ。わかったらもう一度詩ね。
0370名無しさん@お腹いっぱい。
2006/02/26(日) 22:12:06expect eof
しとけ。馬鹿。氏ね。
0371名無しさん@お腹いっぱい。
2006/02/26(日) 22:29:14.cshrcに下の行を登録して
alias test1 'find \!:1 -name \"\!:2\*\" -print'
test1 dir1 file1 と打つと、
find dir1 -name "file*" -print というコマンドを実行させたいけど、
うまく動かない。どう修正すればいい?
0372名無しさん@お腹いっぱい。
2006/02/26(日) 22:33:110373名無しさん@お腹いっぱい。
2006/02/26(日) 23:09:12代返してくれる親切な人も居る。
>>363
シェルって言うな、クズ。
0374名無しさん@お腹いっぱい。
2006/02/26(日) 23:17:01cshはスレ違い。
インタラクティブ系もスレ違い。
インタラクティブ系でしか使わないaliasの話もスレ違い。
わかったら帰れ!
0375名無しさん@お腹いっぱい。
2006/02/26(日) 23:41:38ありませんか?(英語でも構いません)
マニュアルページ
ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html
も詳しいですが、何かスッキリしません。
もっと抽象的に整理された形で、かつ、厳密に書かれたものは無いでしょうか?
0376名無しさん@お腹いっぱい。
2006/02/26(日) 23:41:48黙れ。一人で勝手に仕切るな。
0377名無しさん@お腹いっぱい。
2006/02/27(月) 00:00:170378名無しさん@お腹いっぱい。
2006/02/27(月) 00:24:490379名無しさん@お腹いっぱい。
2006/02/27(月) 00:29:20ソースを見ればいいのでは。
0380名無しさん@お腹いっぱい。
2006/02/27(月) 00:52:13ソースコードを1から読まずに済むならそれに越したことはありません
マニュアルページはある意味詳細に過ぎて見通しが悪いように思います
0381379
2006/02/27(月) 00:54:250382名無しさん@お腹いっぱい。
2006/02/27(月) 01:10:33そのたびに規則を書き出すやつなんていないだろ。
ソース読むしかないよ。
0383名無しさん@お腹いっぱい。
2006/02/27(月) 01:48:36はあ、そういもんですか
言語なんだから仕様ぐらいキッチリ決まっているもんだと思っていたけど
そーいうのがシェルの文化なんかな
でもちょっとした仕様の誤認識とかで致命的な結果を招きかねないのは
困ると思うんだけど
嫌な人は他のスクリプト言語使えって事かな
0384名無しさん@お腹いっぱい。
2006/02/27(月) 02:02:150385名無しさん@お腹いっぱい。
2006/02/27(月) 02:20:59違うな。bashなり犬なりだけに見られる腐れた文化だ。
0386名無しさん@お腹いっぱい。
2006/02/27(月) 03:35:19たぶん
0387名無しさん@お腹いっぱい。
2006/02/27(月) 06:59:040388名無しさん@お腹いっぱい。
2006/02/27(月) 08:04:45やっぱソースしかないんじゃね?
0389名無しさん@お腹いっぱい。
2006/02/27(月) 10:50:05bash について知りたかったのは大抵の環境で対話型シェルの標準になっている
からですが、 sh として起動された場合は POSIX 互換に近くになるようなので
探してみた
ttp://www.opengroup.org/onlinepubs/009695399/
がそれらしい
0390名無しさん@お腹いっぱい。
2006/02/27(月) 11:13:410391名無しさん@お腹いっぱい。
2006/02/27(月) 11:16:450392名無しさん@お腹いっぱい。
2006/02/27(月) 11:33:16そういうことにしたいのですね。
0393名無しさん@お腹いっぱい。
2006/02/27(月) 11:46:48そういう理由ならexplorer.exeについてでも調べた方がいいんじゃまいか。
おそらく最多のユーザ人口を抱える対話型シェルだよ。CUIじゃないけど。
0394名無しさん@お腹いっぱい。
2006/02/27(月) 12:41:57「sh として起動された場合は POSIX 互換に近くになる」と
マニュアル等には書いてあるが、これはかなり嘘。
実際にはshで起動してもbashとほとんど変わらない。
bashの独自拡張もほぼ全部使えてしまう。
目立った違いは、exportコマンドを引数なしで実行した時の表示が
bashだと declare -xなのが、shで起動すると exportの表示に
変わることくらい。
0395名無しさん@お腹いっぱい。
2006/02/27(月) 12:48:02Mac OS Xも今のバージョンはbashがデフォルトっぽいです。
2つ前くらいまではtcsh(sh)がデフォでした。
まぁ、私はtcshの方が良いと思うけど。
0396名無しさん@お腹いっぱい。
2006/02/27(月) 12:52:49やっぱashが漢?
>>395
tcshって少し昔しか知らないんだけど、シェルスクリプトに使うには重くない?
個人的にcsh構文ではまった記憶が多いので、偏見あるかもですが。
0397名無しさん@お腹いっぱい。
2006/02/27(月) 13:37:210398名無しさん@お腹いっぱい。
2006/02/27(月) 13:43:120399名無しさん@お腹いっぱい。
2006/02/27(月) 22:07:010400名無しさん@お腹いっぱい。
2006/02/27(月) 22:51:53Kシェルってファンクション(内部関数)作れるんだよね?
繰り返し処理をそこでやりたいんだけどどうやって記述するの?
0401名無しさん@お腹いっぱい。
2006/02/27(月) 23:31:070402名無しさん@お腹いっぱい。
2006/02/27(月) 23:33:01繰り返したい処理をC-c C-vで必要な回数コピペする。
■ このスレッドは過去ログ倉庫に格納されています