Shell陷阱:$!和$?等變數在推送到遠程主機執行時的取值問題

來源:互聯網
上載者:User

標籤:

對於$!和$?這類依賴內容相關的變數,當其作為命令列中的一部分被推送到遠程主機執行時,一定要考慮到的它的特殊性,否則指令碼很難按你預料的方式執行,並且由此引起的錯誤也很難定位。

讓我們兩個例子:

第一個例子是通過SSH向遠程主機推送"建立使用者組和使用者“:

addUser(){    node=$1    user=$2    group=$3    ssh -T [email protected]$node <<EOF    #add group if not exists    egrep "^$group" /etc/group >& /dev/null    if [ "$?" != "0" ]    then        groupadd "$group"    fi    #add user if not exists    egrep "^$user" /etc/passwd >& /dev/null    if [ "$?" != "0" ]    then        useradd -g "$group" "$user"    fiEOF}

問題發生在:

   if [ " $?" != "0" ]

$?不是egrep "^$group" /etc/group >& /dev/null的執行結果!而是ssh登入之前本機執行的上一條命令的執行結果!

類似問題也出現在下面這段試圖擷取前一個後台運行進程的PID的指令碼裡:

ssh -T [email protected]<<EOFsu -l hive -c "nohup $HIVE_HOME/bin/hive --service metastore -hiveconf hive.log.file=hive-metastore.log -hiveconf hive.log.dir=$HIVE_LOG_DIR>$HIVE_LOG_DIR/hive-metastore.out 2>$HIVE_LOG_DIR/hive-metastore.log &"su -l hive -c "echo $!|cat>$HIVE_PID_DIR/hive-metastore.pid"EOF

這裡的問題是, echo $!|cat>$HIVE_PID_DIR/hive-metastore.pid,$!的值並不是遠程主機上hive metastore服務的PID,而是本機上前一個後台服務的PID!


簡單地總結是:如果你打算通過SSH向遠程主機推送命令,當命令中使用到$?或$1這類完全依賴內容相關的變數時,你需要特別小心了,通常情況下,它們的取值完全不是你期望的!


Shell陷阱:$!和$?等變數在推送到遠程主機執行時的取值問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.