2

I have a script (file_redirection.sh), where I have tried various combinations to get what I want:

#!/bin/bash
echo "cat " $*
echo "cat $*"
echo "cat $@"
echo "cat " $@

I would like to be able to run

file_redirection.sh < tmp_file

And have it show

"cat < tmp_file"

Is that possible?

4

3 に答える 3

6

いいえ、それは不可能です。<コマンドラインの は、スクリプトが実行される前にシェルによって解釈されます。<スクリプトに入れるには、をエスケープする必要があります。例えば:

file_redirection.sh \< tmp_file

探している出力が生成されますが、ファイルのリダイレクトは行われません。

于 2013-03-12T18:38:17.127 に答える
5

あなたは「それがどのように機能するか」と尋ねます。UNIX プロセスは、 と呼ばれるアクションを使用して作成されforkます。これは、現在のプロセスのコピーを取り、非常に効率的な方法でほぼそのままコピーします。コピーには、stdin、stdout、stderr が存在するファイル記述子テーブルも含まれます。

リダイレクトを行うと、シェルは分岐し、子の独自のファイル記述子 (fd) テーブルを変更します。次に、同じプロセスで同じ fd テーブルを使用して新しいスクリプトを実行します。従来のメカニズムを使用すると、プロセスがチェックできる唯一のことは、stdin が端末に接続されているかどうかです。Cでは使用isatty()し、bashでは使用できますif [[ -t 0 ]]...(ゼロは標準入力のfdです)。

Linux (Linux を使用している場合) では、追加のオプションがあります/proc/$$/fd。fd テーブルは、読み取り可能な形式で表示されます ($$ は現在のプロセス ID を示します)。 ls -l /proc/$$/fdそして、あなたは私が何を意味するかを見るでしょう.

それで、私はリダイレクトされますか?

if [[ -t 0 ]]   # is stdin a terminal?
then
    suffix=""
else
    line=$(ls -l /proc/$$/fd/0)
    file="${line##*-> }"

    suffix="< $file"
fi

echo "cat $suffix" 

コマンドラインで:

/home/user1$ file_redirection.sh < tmp_file
cat < /home/qa/tmp_file

しかし。なぜあなたはそれをしたいのですか?

于 2013-03-12T21:05:17.653 に答える
-1

これを使って:

file_redirection.sh "< tmp_file"

そしてあなたのファイルでこれ:

echo "cat $1"

また

file_redirection.sh \< tmp_file

そしてあなたのファイルでこれ:

echo "cat $*"

于 2013-03-12T18:41:16.187 に答える