2017-03-07 44 views
-2

平臺:debian8 + bash。
跑在我的終端下面的命令給了我以下結果:爲什麼不輸出非登錄外殼狀態的代碼?

prompt> echo $0 
/bin/bash 

我想要得到什麼shell登錄狀態,回聲給予比回聲$ SHELL更多信息。
1.殼型是bash的
2.it是一個非登錄殼

prompt> echo $0 
-/bin/bash 

這意味着不僅使用bash外殼,但只有一個登錄殼。

當我創建一個文件test.sh,只包含行:

echo $0 

運行它產生:

prompt> /bin/bash test.sh 
test.sh 

換句話說,我拿到劇本的名字,而不是外殼名。有沒有辦法得到殼牌名稱/bin/bash而不是?
echo $ SHELL不是我想要的,echo $ SHELL只包含shell類型,不告訴我它是登錄shell或非登錄shell。

爲了讓我的意圖清晰,讓我們edite兩個文件:〜/ .profile文件和〜/ .bashrc中

vim .profile 
varLog="i am login shell" 

vim .bashrc 
varLog="i am not login shell" 

~$ /bin/bash 
~$ echo $varLog 
i am non-login shell 
~$ /bin/bash --login 
~$ echo $varLog 
i am login shell 

我們編輯bash腳本。

vim /tmp/decideShell.sh 
echo $varLog 

註銷並再次登錄。

[email protected]:~$ ls -al /tmp/decideShell.sh 
-rw-r--r-- 1 debian8 debian8 13 Mar 8 09:40 /tmp/decideShell.sh 

[email protected]:~$ /bin/bash /tmp/decideShell.sh 

[email protected]:~$ /bin/bash --login /tmp/decideShell.sh 
i am login shell 

爲什麼沒有輸出爲/ bin/bash /tmp/decideShell.sh?

+1

我*想*我已經整理它與您的實際意圖,請檢查並評論,如果我錯了。 – paxdiablo

+0

是的,謝謝paxdiablo –

+0

您可能正在尋找'shopt login_shell',但它不是很清楚。 –

回答

-1

該腳本可以給你一些想法:

echo ppid pid command 
me=$$ 
while [ $me != 1 ]; do 
    ps=$(ps h -o ppid,pid,args -p $me) 
    echo $ps 
    me=$(echo $ps |cut -d" " -f1) 
done 

在我的情況(Debian的穩定的Linux,從膩子推出的mrxvt推出)輸出是:

PPID PID指令
4921 4922 bash
3938 4921 bash
3937 3938 mrxvt -fn - -fixed-medium -r- - -12- - - - - -iso8859-15 -vb -sl 300
1 3937 -bash

此腳本會打印過程中的樹,從電流可達開始初始化(因爲我們知道它的一切,所以不打印)。對於每一行,都有父PID,用於上升,PID和完整的命令行。您可以將選項更改爲ps(1),並檢查其輸出。也許你只對打印的第一行(當前進程)或其父文件($ PPID)感興趣。

我希望它有助於開始。

更新後發表評論。通過這個命令裏面的膩子運行此腳本:

./sc.sh

輸出爲:

ppid pid command 
3938 4004 -bash 
3936 3938 -bash 
2306 3936 sshd: [email protected]/1 
1 2306 /usr/sbin/sshd 

,我可以看到我在外殼是登錄shell(因爲「-bash」)。

相反,要求以下列方式腳本:

的bash --login script.sh

輸出變爲:

ppid pid command 
3938 3945 bash --login sc.sh 
3936 3938 -bash 
2306 3936 sshd: [email protected]/1 
1 2306 /usr/sbin/sshd 

表明,該工藝本身不在登錄shell中,但已從登錄shell啓動。我認爲這裏使用的方法可以用來檢測任何情況。

+0

無法區分非登錄shell的登錄shell。 –

+0

@it_is_a_literature:它在上面的清單中看到,進程非登錄bash由另一個bash調用,而bash又由mrxvt調用,而mrxvt又由登錄shell「-bash」調用。可能會有不同的情況,我發佈的腳本可以分析所有這些情況。 – linuxfan

-1

$ 0具有特殊含義,它的值取決於shell或shell如何解釋腳本被調用。在bash手冊頁中有詳細解釋的特殊情況,但在大多數情況下,它是被解釋的shell或shell腳本的名稱......因此,腳本返回它的名稱而不是正在使用的shell是非常正常的來解釋腳本(在你的情況下,解釋器隱含在用於執行它的命令中)。

我不明白你爲什麼想知道一些隱含的方法來執行腳本,或者依賴於腳本本身指定解釋器的方式......但是你可能有你的理由爲了做到這一點...在這種情況下,你可能想看看這個stackexchange上的答案:https://unix.stackexchange.com/a/26782

至於哪個外殼正在解釋$外殼正確的地方看。 如果你只是想不帶路徑的外殼做$ SHELL最長前綴去除這樣的:

echo ${SHELL##*/} 
+1

我只顯示獲取shell路徑或shell名稱的代碼...沒有其他代碼...所以我不能錯誤的關於非登錄shell!此外,如果你關心閱讀,我會給你一個關於在哪裏獲得這些信息的鏈接,並且最初我沒有把你的問題投票重複。但是因爲你甚至沒有閱讀我現在聽到的答案。 – louigi600

-1

嘗試以下操作:

myname=$(id -u -n) 
myloginshell=$(grep "${myname}:" /etc/passwd | cut -d ':' -f 7) 
printf "my login shell: %s\n" ${myloginshell} 

取決於你的登錄權限,你會發現安全規則您的用戶名是否在/etc/passwd(即ldap權限或其他)。如果你的用戶名存儲在這個文件中,你可以找到你的默認登錄shell作爲第7列。第一列是您的用戶名。

如果您是通過其他方式(LDAP或特殊其他)的授權,並沒有發現在passwd文件您​​的用戶名,你可以改變你的個人資料(取決於您的UNIX版本中.profile.bashrc或whatelse)。用

設置你自己的變量(即myloginshell)
myloginshell=$(echo $0 | sed -e 's/\-//') 

並且不要忘記導出這個變量。你的shell的完整路徑可以

type -p ${myloginshell} 

最後每次examinated但並非最不重要,你可以找到與shopt命令一些特殊信息(login_shell,restricted_shell,...)。

+0

錯誤,代碼將非登錄shell視爲登錄shell,請進行測試。 –

相關問題