簡體   English   中英

我如何評估通過stdin傳遞給bash腳本的文件名

[英]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}readline ,和${file}file

希望我們能理解您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM