Shell

如何通過env命令使用換行符設置值?

  • October 17, 2021

我的意思是使用以下形式的 GNUenv或 BSDenv命令:

env [name=value ...] [utility [args ...]]

看起來沒有辦法value部分轉義特殊字元,但我不太確定如何env實現解析value部分。

我知道通過 shell 的功能有很多方法可以做到這一點,但我想在沒有 shell 幫助的情況下傳遞文字字元串(有點像 execute envby exec)。也就是說,我需要找到某種帶有換行符並由env命令支持的文字字元串格式。例如:

env FOO=LITERAL_STRING ruby -e 'puts ENV["FOO"]'

這裡LITERAL_STRING應該包含一個帶有換行符的文字字元串,並且env應該理解這種格式。

使用上面的命令,預期的輸出應該是:

hello
world

我想知道這是否可能。我會很感激你的幫助。

環境

  • env

我使用 BSD env,所以它無法列印版本。不知道man能不能幫上忙:

$ man env | tail -n1
BSD                             April 17, 2008                             BSD
$ sw_vers
ProductName:    macOS
ProductVersion: 11.6
BuildVersion:   20G165

你的理解是不正確的。當您將內容儲存"hello\nworld"到變數中時,\n將按字面意思解釋。僅當您呼叫printfecho使用-e標誌之類的工具時,它們才會在列印到控制台時擴展這些反斜杠序列。

在您的情況下,您希望將變數傳遞給擴展換行符的環境,建議為此在 bash 中使用ANSI C 樣式引用

env FOO=$'hello\nworld' ruby -e 'puts ENV["FOO"]'

或者,如果可移植性是一個問題,一個簡單的解決方案是將這些換行符放在您想要的位置

f="hello
world"

env FOO="$f" ruby -e 'puts ENV["FOO"]'

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