2017-03-13 26 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}」設置爲「file.txt」而不是「/ dev/stdin」? – 218

回答

1

將數據作爲從文件重定向的流傳遞給您。你的腳本不會有任何該文件的知識 - 只有流。作爲進一步的例子,它可能是從另一個進程的輸出中輸入數據,所以你不會有任何文件開始。

+0

如果我設置eval =「file.txt」,那麼這個工作。我想要做的是用在stdin中指定的文件名替換「file.txt」,這樣我就不必在代碼中爲我想要應用此腳本的每個文件都更改它。 – 218

1

正如@布賴恩·阿格紐說,你是從您的文檔閱讀,因此一個良好的使用命令行的是:

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" 

編輯:在read取代${line}通過line${file}file

我希望大家明白你的問題。

+0

files_list.txt需要採用什麼格式。如果我嘗試這樣,我只是得到'sed:不能讀取:沒有這樣的文件或目錄。'如果我在循環中加入了一個額外的'echo'$ {file}「',我只是得到一個空行,所以它顯然無法讀取我提供的任何文件名。 – 218

+1

'read -r $ {file}'應該是'read -r file'。 +1 –

+0

對不起,修正了它。我總是犯這個錯誤! – jraynal