[過去ログ] くだらねえ質問はここに書き込め! Part 234 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
399(3): 2018/12/22(土)20:12 ID:TtAeAAdm(1) AAS
シェルスクリプトで
touch $LOGERR
exec 2> $LOGERR
コマンド
$LOGERRがあるならメール送ったり、$LOGERRを削除
みたいな部分があるのですが、
2> $LOGERR はエラーログを記録するのはわかるのですが、
execコマンドはそもそも何をしているのでしょうか?
コマンド 2> $LOGERR はコマンドを実行してそのエラーログを格納するのは理解できるのですが、
execというものを使ったことがないので、よくわかっていません。
400(1): 2018/12/22(土)21:01 ID:0mXx4pJn(1) AAS
>>399
exec以降のコマンドの標準エラー出力が$LOGERRにリダイレクトされるようになる
402(1): 2018/12/23(日)05:37 ID:HJ+H2evR(1/4) AAS
>>399
シェルスクリプトのexecは、カーネルのexecシステムコールを呼び出すもの
機能としては外部コマンド呼び出しに近いが、外部コマンドが終了しても処理が戻ってくることはない
callではなくgotoといったらわかるかもしれないな
プロセスの入れ替え。だからpidも変わらないし、プロセスツリーが深くなったりもしない
これがexecの機能なのだが、補足としてexecで呼び出す外部コマンドを指定しなかった場合は
エラーになったり終了するのではなく、現在のプロセス(カレントシェル)の処理が
そのまま続行するという仕様がある
この仕様を利用し、execで(外部コマンドを書かずに)リダイレクトのみを書いておくことで
カレントシェルの出力先を変更して処理を続行することが出来る
(もちろん外部コマンドを書くと、リダイレクト先を変更した上で外部コマンドが実行される)
/bin/foo >/tmp/foo # fooコマンドを呼び出し、fooコマンドが終了したら戻ってくる(fooコマンドの出力はすべて/tmp/fooに書き込まれる)
exec /bin/foo >/tmp/foo # fooコマンドを呼び出し、fooコマンドが終了しても戻ってこない(fooコマンドの出力はすべて/tmp/fooに書き込まれる)
exec >/tmp/foo # (外部コマンドが指定されてないので)そのまま続行する。(以降のカレントシェルの出力はすべて/tmp/fooに書き込まれる)
ということ
404: 399 2018/12/23(日)09:58 ID:91g6WTHO(1) AAS
>>400-403
レスありがとうございます。
ユーザ権限でexec lsやexec ps -aef などをすると、確かに標準出力をした後にバッサリ切断されました
素人的に「?」なのは、exec lsなど後にコマンドが来るのはわかるのですが、
exec 2> $LOGERR の「2>」はコマンドでは無いと思うのですが、もしかして「2>」はリダイレクトコマンドの省略型なのでしょうか?
>exec以降のコマンドの標準エラー出力が
とありますが、それをエラー出力に戻すこともexecコマンドなのでしょうか。
バックアップのシェルスクリプトで見かけたのですが、execコマンドを意図的に使っているのは
execコマンドを使わないとできないことなのか、この時代なら使わないに越したことは無いのでしょうか?
スクリプトの最後に
---
if [ -s "$LOGERR" ]
then
echo
else
eval rm -f "$LOGERR"
fi
---
とあるのですが、echoで終わっているのに何か意味があるのか気になるのと、
eval rmコマンドというのがありますが、普通にrmではダメなのでしょうか?
execやevalなど、コマンドの前に何か来るのに慣れていないので、
人が作ったスクリプトというのは理解するのが難しいです。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.039s