Bash 将读取重定向到输出

Bash 将读取重定向到输出,bash,command-line,posix,Bash,Command Line,Posix,我有一段代码,用于更改空间划定数据库的第一段: if [[ "$(cut -d ' ' -f 1 commandnames.txt | grep -F "$2")" == "" ]] ; then while read -r name rest; do if [[ "$1" == "$name" ]] then echo "$2 $rest" else echo "$name $rest"; fi done < commandnames.txt &g

我有一段代码,用于更改空间划定数据库的第一段:

if [[ "$(cut -d ' ' -f 1 commandnames.txt | grep -F "$2")" == "" ]] ; then
    while read -r name rest; do
    if [[ "$1" == "$name" ]]
    then echo "$2 $rest"
    else echo "$name $rest"; fi
    done < commandnames.txt > commandnames.txt
    echo "Renamed $1 to $2."              
fi
if[[“$(cut-d'-f1 commandnames.txt | grep-f“$2”)=”];然后
而read-r名称休息;做
如果[[“$1”==“$name”]]
然后回显“$2$rest”
else回显“$name$rest”;fi
完成commandnames.txt
echo“将$1重命名为$2。”
fi
但是,
>commandnames.txt
不起作用,而是清除文件。当输出为标准输出时,它工作正常。我尝试将
while
循环放入子shell,直到stdout重定向到子shell中,但它似乎不起作用。你知道为什么它不起作用吗

但是,
>commandnames.txt
不起作用,而是清除了 文件

说“输出文件”将首先截断文件

因此,尝试读取同一文件不会产生任何结果

将输出重定向到另一个文件,然后根据需要在以后执行
mv
cp
操作


1引用(重点矿山):

重定向输出会导致文件名由 要打开以在文件描述符n上写入的字的扩展,或 如果未指定n,则为标准输出(文件描述符1)。如果 创建时文件不存在如果它确实存在,则会被截断为 零尺寸

但是,
>commandnames.txt
不起作用,而是清除了 文件

说“输出文件”将首先截断文件

因此,尝试读取同一文件不会产生任何结果

将输出重定向到另一个文件,然后根据需要在以后执行
mv
cp
操作


1引用(重点矿山):

重定向输出会导致文件名由 要打开以在文件描述符n上写入的字的扩展,或 如果未指定n,则为标准输出(文件描述符1)。如果 创建时文件不存在如果它确实存在,则会被截断为 零尺寸

执行时

while read -r name rest; do
...
done < commandnames.txt > commandnames.txt
执行时

while read -r name rest; do
...
done < commandnames.txt > commandnames.txt

如果没有某种临时存储,您将无法做到这一点

如果100%确定commandnames.txt文件不会太大,可以将该文件读入变量,然后解析变量的内容

GV_LINES=$(cat test_lines.txt)
while read LV_LINE
do
  echo "${LV_LINE}_suffix"
done <<< "${GV_LINES}" > test_lines.txt
GV_LINES=$(cat test_LINES.txt)
读LV_行时
做
回显“${LV_LINE}\u后缀”

完成如果没有某种临时存储,您将无法做到这一点

如果100%确定commandnames.txt文件不会太大,可以将该文件读入变量,然后解析变量的内容

GV_LINES=$(cat test_lines.txt)
while read LV_LINE
do
  echo "${LV_LINE}_suffix"
done <<< "${GV_LINES}" > test_lines.txt
GV_LINES=$(cat test_LINES.txt)
读LV_行时
做
回显“${LV_LINE}\u后缀”

当我输出到stdout时,它就完成了;这不是问题所在。我将编辑原始问题。编辑:好的,我看到了你的编辑。截断是否发生在mid命令中?@bb010g是的,它不起作用,因为您试图将输出重定向到同一个文件。当我输出到stdout时,它起作用;这不是问题所在。我将编辑原始问题。编辑:好的,我看到了你的编辑。截断是否发生在mid命令中?@bb010g是的,它不起作用,因为您试图将输出重定向到同一个文件。