我想评估通过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
为什么此代码无法读取我传递给它的文件名?
答案 0 :(得分:1)
该数据将作为从文件重定向的流传递给您。您的脚本不知道该文件 - 只有流。作为另一个例子,它可能是从另一个进程的输出传入的数据,因此您不会有任何文件开始。
答案 1 :(得分:1)
正如@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
我希望我们理解你的问题。