2015-02-23 84 views
-1

我的腳本使用認領行「#!/ bin中/ KSH」和默認的shell $ echo $SHELL /bin/ksh腳本是否使用與缺省shell相關的shebang行?

我而動所有這些腳本不改變shebang行到一個新的機器,其中默認的shell是開發 $ echo $SHELL /bin/bash

我應該擔心這個嗎?

我猜測應該不會有任何問題,因爲shebang行會覆蓋解釋器,並使用腳本中定義的ksh,因爲我希望它是。

請分享你的想法..

+1

你是對的:shebang行在任何'execve()'調用中都有效。只有當你的腳本來源時,你需要關心他們從哪個解釋器被調用。 – 2015-02-23 19:51:57

+0

或者列出的解釋器不存在或不可執行或其他奇怪。 – 2015-02-23 19:52:24

回答

1

默認的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。

+0

非常感謝Keith – Kevin 2015-02-23 20:26:14

+1

沒有'#!'的腳本將由'/ bin/sh'由zsh和dash執行,但是當前shell由ksh,bash和ash組成。 – 2015-02-23 20:50:32

+0

@thatotherguy:有趣,感謝您的糾正。當然,如果你總是使用'#!',你不必擔心它。 – 2015-02-23 20:56:06

0

給出的假設是正確的:在家當線路上的任何電話execve()榮幸。只有當您的腳本來源(. yourscriptsource yourscript)或缺少有效的shebang時,您是否需要關心它們從哪個解釋器被調用。

如果這不是真的,非shell語言的腳本將無法按預期工作(例如,Python解釋器,例如,永遠不會系統的默認shell)。

+0

謝謝澄清Charles – Kevin 2015-02-23 20:26:44

0

內核將使用家當線來選擇適當的解釋時,腳本在默認的方式執行使用,無論是shbashkshexpectpython,或什麼的。唯一需要注意的真正問題是在系統上編寫的腳本,其中sh是一個特定的shell(例如bash),然後移動到另一個系統,其中sh是不同的shell(例如破折號),因爲它們可能使用前者在後者中不存在。

+0

非常感謝lgnacio – Kevin 2015-02-23 20:27:24