題 切換到ZSH有什麼風險?


假設您使用Bash shell,大多數建議使用Mac。如果我切換到zsh,我在系統上使用當前的Bash腳本會變得多麼不兼容,並且SU上的人會給我建議嗎?

是嗎? #!/bin/sh 我腳本開頭的行有幫助嗎?

編輯: 與問題無關的是我為什麼要這樣做。更好的標籤完成。我剛剛嘗試了zsh放入登錄腳本 如此處所示 而且我完全被吹走了。


4
2018-05-16 23:42


起源




答案:


您顯示的shebang行表示使用Bourne shell(或兼容模式下的其他shell)運行腳本。如果您切換到zsh作為交互式shell,那些腳本可能會繼續使用與現在相同的shell運行。唯一可以改變的方法是鏈接 sh 至 zsh,但這不應該改變功能。

當用作登錄shell時,或者使用shebang行編寫專門調用其中一個或另一個的腳本時,您會發現zsh和Bash之間存在一定的兼容性:

#!/usr/bin/bash

要么

#!/usr/bin/zsh

但是,zsh有很多不同的東西,或者Bash完全不能做的事情。 Bash的使用範圍更廣,因此熟悉zsh錯綜複雜的人越來越少。但是,有關它的信息可以廣泛使用。此外,您會發現這裡有足夠的幫助。

您會發現,對於編寫腳本,shell比Bourne shell強大得多(sh),但以便攜性為代價。此外,由於Bash比zsh使用得更廣泛,因此其腳本相對更具可移植性。


4
2018-05-16 23:58



感謝那。你說“要么shell比Bourne shell強大得多。”你的意思是 bash要么 zsh 當你在shebang線上展示? - Dan Rosenstark
@Yar:是的,Bash和zsh(甚至是Korn shell,尤其是ksh93)都有比它更多的功能 sh。 - Dennis Williamson
好的,所以幾乎所有shell腳本都是為兼容模式編寫的。我不知道。同時我的shebang線說 #!/usr/bin/env ruby 大部分時間,但我確實使用了很多其他人的 sh 腳本。 - Dan Rosenstark


我不是zsh用戶,但是從我在SuperUser和其他地方看到的內容來看,我總是給人的印像是它的粉絲專注於其交互式使用的額外功能而不是腳本。關於zsh的描述的第一句話 ZSH網站,重點強調了交互功能:“Zsh是一個專為交互式使用而設計的shell,儘管它也是一種強大的腳本語言。”

也就是說,如果您計劃切換登錄shell,則可以繼續使用bash編寫腳本。正如另一個答案所指出的,bash腳本將更具可移植性。

具有顯式的現有腳本 #!/bin/sh (要么 #!/bin/bash 或者任何其他路徑)將繼續正常工作,無論您的登錄shell。


4
2018-05-17 03:04



當我自己編寫腳本時,我使用Ruby :)很好的答案,謝謝! - Dan Rosenstark
使用zsh非常方便。編寫腳本,完全沒有。順便說一句,zsh的行為取決於你如何調用它,即如果/ bin / sh是/ bin / zsh的符號鏈接,則zsh將更像/ bin / sh - chiggsy


這裡 你會找到一個“bash化“,即將在bash shell中運行但不在其他bourne兼容shell中運行的代碼片段。

如果要在編寫shell腳本時實現最大的可移植性,而不是啟動腳本 #!/bin/sh 並避免“bashisms”,以便它將在任何其他posix兼容的shell中運行,如ksh或zsh。


3
2018-05-17 04:48



謝謝,添加到其他答案時的好信息。 - Dan Rosenstark


/bin/sh 指向bash,在兼容模式下運行它。更改登錄shell更改的唯一方法是哪些內置函數可用,以及它們如何工作。腳本遵循他們的shebang線。


1
2018-05-16 23:54



應該指出,在某些系統上也是如此。在其他人,它與之相關 dash要么 ash 或其他甚至它實際上是真正的Bourne shell本身。 - Dennis Williamson
對。但問題是標記為“osx”。 - Ignacio Vazquez-Abrams
不幸的是,“注意到”太小,不能評論SU。 - Dan Rosenstark


通過“切換到zsh”,我認為你的意思是兩件事之一:

  • 你會用的 chsh (或等效)將您的登錄shell更改為 zsh的, 要么
  • 你會配置 終奌站 (或等同的)使用 zsh的 作為其默認shell。

大多數shell程序(shell“腳本”)都包含一個 “認領”/“散列砰” 線。 shebang聲明哪個解釋器(shell)應該解釋(運行)跟隨它的程序。

正如其他幾個答案所示,使用shebang行的shell程序不會受到用戶選擇登錄shell的影響,也不受啟動shell程序的父或Nth-parent的交互式shell的影響。

如果您要安裝新版本的 zsh的 並將它包含在你的PATH中,使用像shebang這樣的程序 #!/usr/bin/env zsh 將使用該新版本(當使用放置新版本的PATH啟動時) zsh的 第一)。如果您的舊/原始版本之間發生了一些不兼容的更改,這只會導致問題 zsh的 和新的。請注意,這將是一個內部 - zsh的 (間zsh的-version)問題,而不是我懷疑你擔心的shell間問題。這通常是一個小得多的錯誤類別,而不是(例如)您嘗試運行run a 慶典 程序用 KSH

不使用shebang線本身在用戶環境之間不可移植。嘗試運行可執行文件,非二進製文件的結果 缺少shebang的文件取決於環境(操作系統,shell,可能是登錄shell和環境變量)。在Mac OS X 10.4系統上運行此類文件時,行為會根據運行它的shell而有所不同。 KSH,和 慶典 兩者都在自己的分叉副本中解釋文件。 zsh的 總是把它傳遞給 /bin/sh。如果有一些程序要嘗試 exec 直接,它會失敗 ENOEXEC (這發生在shell中,它們只是通過“以另一種方式”“運行”來“覆蓋它”)。我對一些古老系統的模糊記憶甚至在這種情況下嘗試使用用戶的登錄shell,但我的快速搜索沒有發現任何有用的東西。

 非二進製文件是內核無法識別為其支持的二進制對象格式之一的文件。


就交互兼容性而言, zsh的 支持大部分擴展語法 慶典 和 KSH (雖然必須使用shell選項啟用一些if),你在Super User上找到的大部分“shell”建議都可以正常工作 zsh的 (即使其中一些由“bashisms”組成)。一些東西(命令行編輯綁定,完成,提示顯示等)完全不同 慶典 和 KSH 對於類似的操作需要不同的語法。

  zsh的 確實有點兒 慶典 完成兼容性,但我從未嘗試過。


1
2018-05-17 09:00



還在處理這個。 +1現在:) - Dan Rosenstark
它比bash更好(zsh的bash完成者)。 - chiggsy