[英]How can I evaluate the filename passed to a bash script via stdin
我想評估通過stdin傳遞給腳本的文件名,然后在sed命令中使用它。 目前,我有以下代碼:
#!/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
為什么此代碼無法讀取我傳遞給它的文件名?
這些數據將作為從文件重定向的流傳遞給您。 您的腳本將對該文件一無所知-僅對流有所了解。 再舉一個例子,它可以從另一個進程的輸出中通過數據管道輸入,因此您無需任何文件。
正如@Brian Agnew所說,您正在閱讀文檔,因此可以很好地使用命令行:
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"
編輯:替換${line}
在read
的line
,和${file}
與file
希望我們能理解您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.