2016-09-27 37 views
1

當我的腳本以不同的方式啓動時,爲什麼echo -n「...」的結果會有所不同?

$>echo -n "\033[40m " 

如果我喚起它的命令行,對將其保存到一個文件中,並喚起人們對命令行的文件,結果會有所不同。

我在mac上使用zsh,但期望這也可以與bash一起使用。不應該輸出完全一樣嗎?如果不是,爲什麼?

+0

輸入'tty'並查看結果 – dawg

+0

取決於您未提供的詳細信息。你是否在你的文件上放置了一個shebang,所以它以'#!/ bin/sh','#!/ bin/bash','#!/ bin/zsh'開頭,否則?你是用'./ yourscript'還是'zsh yourscript'或'來調用它。 yourscript'或其他東西?你需要準確地顯示**你正在做什麼,**完全**你得到的行爲,因爲這個問題是可以回答的。 –

+0

順便說一句 - ** zsh不是bash **。如果你使用zsh運行代碼,那麼你就不會在bash中運行它,除非你有zsh啓動一個單獨的bash解釋器來運行該代碼。 –

回答

4

echo -n行爲是殼(和的zsh和bash的確是不同的炮彈),因爲它是,從字面上看,不確定的行爲之間的不同:加工時The POSIX sh specification不需要外殼在任何特定的行爲方式:

以下操作數應予支持:

- 要寫到標準輸出的字符串。如果第一個操作數是-n,或者任何操作數包含反斜槓(\)字符,則結果是實現定義的。

當使用XSI擴展,echo需要處理反斜槓轉義序列等\033未給出進一步的參數;如果沒有這些擴展,根本不需要處理這些序列,而是純粹由實現定義的行爲(因此取決於您的特定外殼)。


作爲一個明確定義的替代,可以考慮:

#!/bin/sh 
#  ^^ - because this code doesn't use any shell-specific extensions; 
#   use #!/bin/zsh if zsh-only, #!/bin/bash if bash-only, etc. 

printf '%b' "\033[40m " 

上面將表現相同,是否帶. yourscript./yourscriptbash yourscriptsh yourscriptzsh yourscript調用,因爲它是由完整的定義POSIX規範(並且不依賴zsh選擇違反該規範的任何行爲)。

如果您使用的是特定於某個外殼的擴展,則需要使用./yourscript(以兌現第一行以根據其內容選擇外殼),僅從同一外殼中調用. yourscript,或者<shellname> yourscript,再次與特定的外殼。

由於這個原因,./yourscript的用法是強烈的首選,因爲它允許腳本本身控制自己的解釋器。


從POSIX echo規範再次引用,此時距離實際應用信息部分:

這是不可能在所有的POSIX系統回聲移植應用,除非兩個-n(作爲第一個參數)並且省略了轉義序列。

printf實用程序可便攜地用於模擬任何echo實用程序的傳統的行爲如下(假設IFS具有其標準值或是解除警戒):

歷史系統V回波和對要求本卷IEEE標準1003.1-2001的XSI實現是等價於:

printf "%b\n" "$*" 

的BSD回波相當於:

if [ "X$1" = "X-n" ] 
then 
    shift 
    printf "%s" "$*" 
else 
    printf "%s\n" "$*" 
fi 

鼓勵新應用程序使用printf而不是echo

相關問題