[過去ログ] くだらねえ質問はここに書き込め! 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