为什么这个函数不能用于吸收标准输入?

Mar*_*mbo 1 bash io-redirection

这:

echo 'some text' > file.txt
cat file.txt > file.txt
Run Code Online (Sandbox Code Playgroud)

显然给了我一个空文件。

但也令我惊讶的是:

cat2 () {
    cat "$@" > tmp.txt
    cat tmp.txt
    return $?
}

echo 'some text' > file.txt
cat2 file.txt > file.txt
Run Code Online (Sandbox Code Playgroud)

它给了我一个空文件,即使该文件tmp.txt已被删除,与file.txt.

这个方法也行不通!:

echo 'some text' > file.txt
cat file.txt | cat2 > file.txt
Run Code Online (Sandbox Code Playgroud)

为什么文件还是被清空了?

Ste*_*ris 6

你的命令

cat2 file.txt > file.txt
Run Code Online (Sandbox Code Playgroud)

将在调用该函数file.txt 之前创建一个新的空cat2

因此,在运行时,cat2文件是空的,因此cat它将导致空输出。

如果它有助于打破操作顺序,那么您所做的是

  • 创建一个包含内容的文件 file.txt
  • 创建一个新的空白文件file.txt
  • 运行 cat2 并输出到 file.txt

这是因为重定向运算符发生在cat2执行之前。