私はUNIXシステム管理に関する教科書を勉強しています。 Syed Mansoorの「UNIX第3版」3章。
第13章には、次のexecの使い方の例があります。これは非常に簡単で、私の期待に従います。
% /bin/csh
% exec date
Thu Jul 31 18:16:01 PKT 2014
ただし、この章の後半には次の例があります。
% cat sample
date
echo "Hello, world!"
% /bin/sh
% exec < sample
Thu Jul 31 18:41:38 PKT 2014
Hello, world!
しかし、これを試してみると、次のような結果が得られます。
$ exec < sample
$ $
タイプミスではなく、私が作った結果です。ここになぜ違いがあるのか理解できません。私はPC-BSDで実行しています。この章の説明は、このコマンドが現在のシェルの入力をstdinからファイルにリダイレクトすることです。したがって、このコマンドを実行し、その出力をまだシェルのstdoutに印刷する必要があります。私も試しました
exec < sample > /dev/tty
(私の考えでは)完全なチェックとして、これはファイルを現在のシェルに直接入力し、私が使用している端末である基本端末に出力することを意味すると理解します。しかし、私は同じ結果を得ます。
最後に、このセクションの最後に次の質問があります。答えは彼のgithubにありますが、なぜ私の試みがうまくいかないのかわかりません。私はこの解決策がなぜ機能するのか理解していると思います。質問:
シェルのstdinをdataというファイルに変更し、stdoutをoutというファイルに変更するコマンドを作成します。どちらも現在の作業ディレクトリにあります。データファイルに次の行が含まれている場合、コマンドを実行した後に何が起こりますか?
echo –n "The time now is: "
date
echo –n "The users presently logged on are: "
who
私が試した解決策は次のとおりです。
$ exec < data > out
私が理解しているのは、ファイルをdata
シェルの入力として指定し、シェルの出力をファイルとして直接指定することout
です。
( exec > out ; exec ./data )
私はこれをサブシェルで実行し、まずそのサブシェルの出力をfileとして指定し、そのサブシェルを出力がそのファイルにリダイレクトされた実行可能out
ファイルdata
に置き換えるグループ化されたコマンドとして理解します。out
だから私の質問は次のようになります
- 教科書の2番目の例が私のコンピュータで動作するのはなぜですか?作成者のPC-BSDバージョンは、おそらく9年前のバージョンであっても、同じシステムのISOが使用されます。私はこの教科書にのみこの仮想マシンを使用します。
- 運動ソリューションが機能しないのはなぜですか?
- 著者の解決策を正しく理解していますか?
ご配慮ありがとうございます。 PS私はchmod u+x
この例のすべての実行ファイルを実行しました。
コメント作成者のリクエストに応じて編集 以下は教科書の例の試みです。始まりから終わりまでです。仮想マシンなので正確にコピー+貼り付けることはできませんが、1文字ずつ正確に入力して出力しましたが、3回確認するとエラーなくうまくいきます。
[tony@pcbsd-8682] ~/ch12% cat > sample
date
echo "Hello, world!"
[tony@pcbsd-8682] ~/ch12% /bin/sh
$ exec < sample
$ [tony@pcbsd-8682] ~/ch12% file sample
sample: ASCII text
練習用:
[tony@pcbsd-8682] ~/ch12/13.4d-redux% cat data
echo -n "The time now is: "
date
echo -n "The users presently logged on are: "
who
[tony@pcbsd-8682] ~/ch12/13.4d-redux% file data
date: ASCII text
[tony@pcbsd-8682] ~/ch12/13.4d-redux% /bin/sh
$ exec < data > out
$ [tony@pcbsd-8682] ~/ch12/13.4d-redux%
答え1
教科書の台本に誤りがあると言いたいです。スクリプトを次のように変更しましたが、うまくいきました。
% cat > sample
date
echo "Hello, world!"
# Press Ctrl-D (End Of File) here to stop entering data into file sample
% /bin/sh
% exec < sample
Thu Jul 31 18:41:38 PKT 2014
Hello, world!
2番目の質問については、この問題が正確に何を求めているのかを完全に理解していませんが、あなたと教科書で提供されたソリューションを試しました。両方とも、データのコマンド実行結果を出力ファイルに書き込みます。だから私は両方とも正しいと言いたいです。