Shell

讀取命令的管道不起作用

  • June 12, 2022

file1如果我重定向為標準輸入,則 sh 中的讀取命令有效

$ cat file1
first second
$ read u v <file1
$ echo $u
first
$ echo $v
second

但是,如果我從 echo 重定向標準輸出

$ echo first second | read a b
$ echo $a

這沒用。我認為 read 在第二種情況下從管道獲取標準輸入。為什麼我錯了?謝謝你。

在您的第一個範例中:

read而“echo”是 shell 內置命令,它們將由您正在輸入命令的互動式 shell 執行(同一程序),因此這些命令的結果與執行 shell 的環境有關。

因此,當從read指令返回時,您仍然在同一個 shell 中完全了解 u 和 v 變數值。

在你的第二個例子中:

即使該命令是內置的,管道也會強制您的互動式 shell 派生一個子程序。在這種情況下,它將觸發一個子shell,該子shell 將執行讀取命令並更新其自己的環境(為 u 和 v 變數賦值)而不影響其父級的環境。

因此,當讀取完成時,子 shell 終止,您回到互動式 shell,它完全不知道其子級設置的 u 和 v 變數值。

引用自:https://unix.stackexchange.com/questions/705860