如何评估通过stdin传递给bash脚本的文件名

时间:2017-03-13 15:46:04

标签: bash

我想评估通过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

为什么此代码无法读取我传递给它的文件名?

2 个答案:

答案 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

我希望我们理解你的问题。