我當我的腳本以不同的方式啓動時,爲什麼echo -n「...」的結果會有所不同?
$>echo -n "\033[40m "
如果我喚起它的命令行,對將其保存到一個文件中,並喚起人們對命令行的文件,結果會有所不同。
我在mac上使用zsh,但期望這也可以與bash一起使用。不應該輸出完全一樣嗎?如果不是,爲什麼?
我當我的腳本以不同的方式啓動時,爲什麼echo -n「...」的結果會有所不同?
$>echo -n "\033[40m "
如果我喚起它的命令行,對將其保存到一個文件中,並喚起人們對命令行的文件,結果會有所不同。
我在mac上使用zsh,但期望這也可以與bash一起使用。不應該輸出完全一樣嗎?如果不是,爲什麼?
的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
,./yourscript
,bash yourscript
,sh yourscript
或zsh 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
。
輸入'tty'並查看結果 – dawg
取決於您未提供的詳細信息。你是否在你的文件上放置了一個shebang,所以它以'#!/ bin/sh','#!/ bin/bash','#!/ bin/zsh'開頭,否則?你是用'./ yourscript'還是'zsh yourscript'或'來調用它。 yourscript'或其他東西?你需要準確地顯示**你正在做什麼,**完全**你得到的行爲,因爲這個問題是可以回答的。 –
順便說一句 - ** zsh不是bash **。如果你使用zsh運行代碼,那麼你就不會在bash中運行它,除非你有zsh啓動一個單獨的bash解釋器來運行該代碼。 –