2017-03-13 4 views
1

stdinを介してスクリプトに渡されるファイル名を評価して、これをsedコマンドで使用したいと思います。stdin経由でbashスクリプトに渡されるファイル名を評価するには

としてこれを呼び出す
#!/bin/bash 

eval file="${1:-/dev/stdin}" 
echo "$file" 
sed -i -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' "$file" 

::次のエラーで

bash callfile < file.txt 

結果:

/dev/stdin 
sed: couldn't open temporary file /dev/sedSVVTdr: Permission denied 

なぜこのコードは、私はファイル名を読み取ることができません現時点では私は、次のコードを持っていますそれにパス?

+1

あなたは 'sed'に'/dev/stdin'でインプレース置換をするようにしているようです。結果はどこに書きますか? – Biffen

+0

'file'を実際の文字列'/dev/stdin'に設定します。Sedは標準入力から読み込むことを意味することは知りません。 –

+0

これはまさに質問です。スクリプトで明示的に設定しなくても、eval 'file =" $ {1: -/dev/stdin} "を"/dev/stdin "ではなく" file.txt "に設定する方法はありますか? – 218

答えて

1

そのデータはファイルからリダイレクトされたストリームとして渡されています。あなたのスクリプトはそのファイルの知識を持っておらず、ストリームだけです。さらに別の例として、別のプロセスの出力からパイプライン化されたデータである可能性があるため、最初にファイルを作成する必要はありません。

+0

私はeval = "file.txt"を設定すると、これは動作します。私がしたいのは、 "file.txt"をstdinで指定したファイル名に置き換えて、このスクリプトを適用するすべてのファイルのコード内でこれを変更する必要がないようにすることです。 – 218

1

@Brianアグニューはので、あなたのコマンドラインの良い使用は、あなたがあなたの文書から読んでいる、言ったように:その後、

while read -r line; do 
    echo ${line} | sed -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' 
done < ${1:-/dev/stdin} 

ファイル内のファイルのリストを持っていることに注意してください、あなたができます意図したとおりに、あなたのプロセスを実行します。

./callfile < files_list.txt 

while read -r file; do 
    sed -i -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' "${file}" 
done < ${1:-/dev/stdin} 

が、現時点で

は、 stdinからの読み込みのも利点はありませんので、:

./callfile "file.txt" 

編集:私たちはあなたの質問を理解願っていfile

line、そして${file}によってread${line}を置き換えます。

+0

files_list.txtにはどのような形式が必要ですか。私がこれを試してみたら、私は 'sed:読み込みできません:そのようなファイルやディレクトリはありません.'という追加の' echo "$ {file}" 'をthieループに置くと空行が得られるだけです。明らかに私が提供したファイル名のいずれかを読むことができません。 – 218

+1

'read -r $ {file}'は 'read -r file'でなければなりません。 +1 –

+0

申し訳ありません、修正しました。私はいつもこの間違いを犯す! – jraynal

関連する問題