シェルスクリプト総合 その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 でトレースしましょう。
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で必要な回数コピペする。
0403名無しさん@お腹いっぱい。
2006/02/27(月) 23:36:35友達いないから俺もやってみたいな。
0404名無しさん@お腹いっぱい。
2006/02/27(月) 23:41:40当時履歴が実装されていた唯一のシェルだったからというのが大きいな。
何でも最初からあったわけではないというお話。
0405名無しさん@お腹いっぱい。
2006/02/27(月) 23:56:34csh でできると知らない人も多そうだけど。
0406名無しさん@お腹いっぱい。
2006/02/28(火) 00:03:17newcshの前にあった?
0407名無しさん@お腹いっぱい。
2006/02/28(火) 00:23:17あったんじゃね?
俺的にcsh本が書かれた時代&そっから数年はcsh以外にfilecが使えるシェルなかったし。
しかしあの数年をなかったことにしてもいいとか思っちゃえるのがcshの魔力。
また、数年後にはbashがでてくるわけだけど、当時のUNIX、68000 8MHzとかだと
bashが糞遅いわけなんだ。cshは糞だけどbashはもっと糞というのが当時の認識だろ。
その後tcshやkshもでたが、同様に遅いshellで、俺はずっとcshをつかってた。移行しても
いいと初めて思えたシェルがzsh。それいらいずっとzshだ。
0408名無しさん@お腹いっぱい。
2006/02/28(火) 00:24:23407でいってるkshはpdkshね。
0409名無しさん@お腹いっぱい。
2006/02/28(火) 00:31:450410名無しさん@お腹いっぱい。
2006/02/28(火) 00:38:140411名無しさん@お腹いっぱい。
2006/02/28(火) 00:38:490412名無しさん@お腹いっぱい。
2006/02/28(火) 00:52:55スレ違いなんで、対話的シェル総合スレでもたててそっちでやってくれ。
0413名無しさん@お腹いっぱい。
2006/02/28(火) 00:56:21zshがでてきて起動すると即帰ってきたからその感動も凄くてねえ。
>410
すまん。単なる俺の過去の経験の暴露だ。
無視してくれ。
0414名無しさん@お腹いっぱい。
2006/02/28(火) 01:15:260415名無しさん@お腹いっぱい。
2006/02/28(火) 01:17:10csh本って"UNIX C Shell Field Guide"のこと?
0416名無しさん@お腹いっぱい。
2006/02/28(火) 01:18:42そんなのprofileの違いだろ。馬鹿か。
0417名無しさん@お腹いっぱい。
2006/02/28(火) 01:23:13スレチガイだってば。
0418名無しさん@お腹いっぱい。
2006/02/28(火) 09:02:57> 拡張BNFになっとるがな。> bashのbisonソース
遅レスだけど教えてくれてありがとう。
シェルスクリプトの展開/置換と評価/実行の規則についてなんですが、
一つの入力単位(if などの複合文でなければ1行の「コマンドライン」)ごとに
字句構文解析→(展開/算術式評価/置換)
→(置換の結果生じた入力単位ごとに、字句構文解析→実行)
という流れで実行に移されると解釈していいのかな?
(あまりにも自明なことかもしれませんが…最後の () 内では
展開/置換が生じることはありえない?)
0419名無しさん@お腹いっぱい。
2006/02/28(火) 09:44:270420名無しさん@お腹いっぱい。
2006/02/28(火) 10:19:16bashと同じスタイル(yacc, lex使う)でshell作っているから。
# bison=GNU yacc
0421名無しさん@お腹いっぱい。
2006/02/28(火) 10:22:550422名無しさん@お腹いっぱい。
2006/03/04(土) 23:22:22$ echo $PWD
/home/nanashi/
となりますが、では $PWD と書かれたファイルから同じような出力を得るには
どうしたらいいでしょうか
$ cat nanashi.txt
pwd = $PWD
path = $PATH
$ [なにかコマンド] nanashi.txt
pwd = /home/nanashi/
path = /sbin:/bin:/usr/bin...
0423名無しさん@お腹いっぱい。
2006/03/04(土) 23:24:480424名無しさん@お腹いっぱい。
2006/03/05(日) 00:06:27なんで = の間が開いているの?
PWD="$PWD"
PATH="$PATH"
なら、
$ . nanashi.txt
で終りなのに。
0425名無しさん@お腹いっぱい。
2006/03/05(日) 00:08:18完全に信頼できるソースから入手したファイルでないならば危険。
ナガタ君のように泣きを見ることになる。
0426425
2006/03/05(日) 00:14:59そのファイルの前に
cat <<EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF
後ろに
EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF_EOF
を追加したファイルを作ってshに食わせる。
0427422
2006/03/05(日) 00:56:11作りたいんですよ。例えば、httpd.conf であれば、
httpd.conf.in ってのを作って、中に
ServerRoot "$PWD/testroot"
とか書いておいて展開したいという。
やっぱ sed ですかねぇ
0428名無しさん@お腹いっぱい。
2006/03/05(日) 00:58:200429422
2006/03/05(日) 01:10:43簡単にできるのかな、と妄想してみただけです。
ちなみに >>423 さんのだと、$PWD を展開した結果に
スラッシュが含まれているからダメっぽいです。
sed -e 's#\$PWD#'"$PWD#" nanashi.txt
とりあえずこんな感じにしてみます
0430名無しさん@お腹いっぱい。
2006/03/05(日) 01:12:530431名無しさん@お腹いっぱい。
2006/03/05(日) 03:36:540432名無しさん@お腹いっぱい。
2006/03/05(日) 08:38:500433名無しさん@お腹いっぱい。
2006/03/05(日) 08:46:33autoツール使いたがる気違いは絶滅すればいいのに。
■ このスレッドは過去ログ倉庫に格納されています