2015-05-04 167 views
4

我想連接到不同的shell(csh,ksh等),並在每個交換shell中執行命令。殼shell內的shell腳本

以下是這反映了我的意圖的示例程序:

​​3210

因爲,我不能很好地與殼牌腳本精通需要就如何實現這一目標的指針。任何幫助將非常感激。

回答

3

如果你想只執行一個命令,你可以使用-c選項

csh -c 'echo $SHELL' 
ksh -c 'echo $SHELL' 

如果要執行幾個命令,或者甚至是一個子shell中的整個腳本,則可以使用bash的here-document功能,並在子shell上使用-s(從stdin讀取命令) :

#!/bin/bash 
echo "this is bash" 

csh -s <<- EOF 
    echo "here go the commands for csh" 
    echo "and another one..." 
EOF 
echo "this is bash again" 
ksh -s <<- EOF 
    echo "and now, we're in ksh" 
EOF 

請注意,你不能很容易地檢查你是在由echo $SHELL殼,因爲母貝擴展這個變量的文本/././bash。如果你想確保子shell能夠工作,你應該檢查一個特定於shell的語法是否正常工作。

+0

非常感謝您的及時幫助,謝謝其他誰給了類似的解決方案 – learningloop

1

可以使用每個shell提供的命令行選項運行一段代碼。

例如,對於bash使用-c選項:

bash -c $code 
bash -c 'echo hello' 

zshfish也使用-c選項。

其他shell將聲明他們在手冊頁中使用的選項。

1

你需要的,如果你想傳遞的bash啓動命令使用-c命令行選項:

#!/bin/bash 
# We are in bash already ... 
echo $SHELL 

csh -c 'echo $SHELL' 
ksh -c 'echo $SHELL' 
1

您可以通過任意複雜的腳本外殼,使用-c選項,如

sh -c 'echo This is the Bourne shell.' 

您將您節省大量的相關報價和變量擴展性頭痛,如果你包裹中的呼叫功能讀取所述腳本上標準輸入爲:

execute_with_ksh() 
{ 
    local script 
    script=$(cat) 
    ksh -c "${script}" 
} 

prepare_complicated_script() 
{ 
    # Write shell script on stdout, 
    # for instance by cat-ting a here-document. 
    cat <<'EOF' 
echo ${SHELL} 
EOF 
} 

prepare_complicated_script | execute_with_ksh 

這種方法的優點在於,它容易在管道中插入三通或打破管,以控制被傳遞給外殼的腳本。

如果您想通過ssh在遠程主機上執行腳本,您應該考慮將腳本編碼爲base 64,以便將其安全地傳輸到遠程shell。

+1

看起來像我失去了一些東西。 '$ configfile'的含義是什麼?這與這個問題有什麼關係? – hek2mgl

+0

@ hek2mgl嗯,我不知道! :)新的例子可能會更好。 –