我的腳本使用認領行「#!/ bin中/ KSH」和默認的shell $ echo $SHELL /bin/ksh
腳本是否使用與缺省shell相關的shebang行?
我而動所有這些腳本不改變shebang行到一個新的機器,其中默認的shell是開發 $ echo $SHELL /bin/bash
我應該擔心這個嗎?
我猜測應該不會有任何問題,因爲shebang行會覆蓋解釋器,並使用腳本中定義的ksh,因爲我希望它是。
請分享你的想法..
我的腳本使用認領行「#!/ bin中/ KSH」和默認的shell $ echo $SHELL /bin/ksh
腳本是否使用與缺省shell相關的shebang行?
我而動所有這些腳本不改變shebang行到一個新的機器,其中默認的shell是開發 $ echo $SHELL /bin/bash
我應該擔心這個嗎?
我猜測應該不會有任何問題,因爲shebang行會覆蓋解釋器,並使用腳本中定義的ksh,因爲我希望它是。
請分享你的想法..
默認的shell不會影響腳本的執行方式(除非你使用了一個非常奇怪的shell)。
沒有
其實這看起來不正確,但無論如何你不必擔心這一點。#!
行的可執行腳本將與
/bin/sh
一起執行。
只要你的腳本開始#!/bin/ksh
和你執行它們通常情況下,系統會通過他們傳遞給/bin/ksh
執行它們。
有一件事你可能不得不擔心的是/bin/ksh
是否存在,如果是這樣,就是它是什麼。在我的系統(Linux Mint 17)上,/bin/ksh
是/etc/alternatives/ksh
的符號鏈接,而這又是/bin/ksh93
的符號鏈接。
腳本與#!/bin/ksh
可能是很常見,幾乎所有的類UNIX系統將滿足他們,將安裝東西表現得像在該位置KSH。
請注意,由$SHELL
指定的稱爲「默認外殼」的內容不是系統範圍的默認設置。這只是特定環境變量的價值。對於每個用戶,該變量設置爲,基於/etc/passwd
中指定的shell或等效項;因此不同的用戶可以有不同的默認shell。您可以在登錄後更改$SHELL
的值。創建帳戶時可以設置/etc/passwd
或同等條目中的條目,並且可以稍後再進行更改。如果未指定shell(例如,大多數Linux系統用戶/bin/bash
),大多數系統都會爲新帳戶設置默認用戶shell。
非常感謝Keith – Kevin 2015-02-23 20:26:14
沒有'#!'的腳本將由'/ bin/sh'由zsh和dash執行,但是當前shell由ksh,bash和ash組成。 – 2015-02-23 20:50:32
@thatotherguy:有趣,感謝您的糾正。當然,如果你總是使用'#!',你不必擔心它。 – 2015-02-23 20:56:06
給出的假設是正確的:在家當線路上的任何電話execve()
榮幸。只有當您的腳本來源(. yourscript
或source yourscript
)或缺少有效的shebang時,您是否需要關心它們從哪個解釋器被調用。
如果這不是真的,非shell語言的腳本將無法按預期工作(例如,Python解釋器,例如,永遠不會系統的默認shell)。
謝謝澄清Charles – Kevin 2015-02-23 20:26:44
內核將使用家當線來選擇適當的解釋時,腳本在默認的方式執行使用,無論是sh
,bash
,ksh
,expect
,python
,或什麼的。唯一需要注意的真正問題是在系統上編寫的腳本,其中sh
是一個特定的shell(例如bash),然後移動到另一個系統,其中sh
是不同的shell(例如破折號),因爲它們可能使用前者在後者中不存在。
非常感謝lgnacio – Kevin 2015-02-23 20:27:24
你是對的:shebang行在任何'execve()'調用中都有效。只有當你的腳本來源時,你需要關心他們從哪個解釋器被調用。 – 2015-02-23 19:51:57
或者列出的解釋器不存在或不可執行或其他奇怪。 – 2015-02-23 19:52:24