Bash

在 bash 中,管道未設置值後讀取

  • December 1, 2020

使用 ksh 我使用 read 作為分隔值的便捷方式:

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
2 1
$

但它在 Bash 中失敗了:

$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a 
 
$

我沒有在手冊頁中找到失敗的原因,知道嗎?

bash子shell 上下文中執行管道的右側,因此不會保留對變數的更改(這是什麼read) - 當子shell 執行時,它們會在命令結束時死亡。

相反,您可以使用程序替換

$ read a b dump < <(echo 1 2 3 4 5)
$ echo $b $a
2 1

在這種情況下,read它在我們的主 shell 中執行,而我們的輸出生成命令在子 shell 中執行。該<(...)語法創建一個子shell並將其輸出連接到管道,我們read使用普通<操作將其重定向到輸入。因為read在我們的主 shell 中執行,所以變數設置正確。

正如評論中所指出的,如果您的目標是以某種方式將字元串拆分為變數,則可以使用此處的字元串

read a b dump <<<"1 2 3 4 5"

我認為還有更多內容,但如果沒有,這是一個更好的選擇。

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