Bash

Shell 命令在終端和腳本中以不同方式執行

  • August 25, 2018

以下命令序列

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch

在終端中執行時或通過source給出輸出

b\\_d

當作為 scipt 執行時

sh script.sh

其中腳本內容是:

#!/bin/bash                                                                                                                                   
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch

輸出是

b\_d

終端的輸出是首選。使用shell腳本的解決方案是什麼?也接受作為答案的是如何修改的想法

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`

sh.

我使用 bash shell:

echo $0
bash

sh不同bash並且表現不同。

我想那sh是真的dash

順便說一句:如果你檢查不同的 shell,這個命令會有不同的行為。

bosh, dash, mksh,zsh以及ksh在 Solaris 上列印一個反斜杠

bash在 Linux上ksh列印兩個反斜杠。

通過查看 $shell -x 輸出,我相信一個反斜杠是正確的輸出。

我不知道為什麼ksh在 Linux 上會這樣。可能是它試圖模仿bash行為。

對於bash可以解釋的行為:bash 有一個非 POSIX echo,它不會按照 POSIX 的要求解釋反斜杠。

POSIXbash只允許在小型嵌入式系統上的行為,否則 POSIX 需要實現所謂的XSI擴展。有了echo,這需要完全遵循echoAT&T 在 1982 年為 SYSv 實施的行為。

重要說明:

如果您有一個以

#!/bin/bash

那是可執行x的(位設置chmod),如果你打電話

sh myscript

該腳本仍然執行,/bin/sh通常dash在 Linux 上執行。所以要小心你如何執行你的程式碼。

有一種方法可以避免您的問題。更改您的腳本以使用:

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch

這樣,您可以避免echo1989 年引入的問題bashprintf仍然不能解決所有問題,因為有許多錯誤的實現,但是參數中的反斜杠引起的常見問題不受printf.

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