簡體   English   中英

返回退出代碼而不關閉 shell

[英]Return an exit code without closing shell

我想從另一個腳本中調用的 BASH 腳本返回退出代碼,但也可以直接調用。 它大致看起來像這樣:

#!/bin/bash
dq2-get $1
if [ $? -ne 0 ]; then
  echo "ERROR: ..."
  # EXIT HERE
fi
# extract, do some stuff
# ...

現在在EXIT HERE行中,腳本應該退出並返回退出代碼 1。問題是

  • 我不能使用return ,因為當我忘記 source 腳本而不是調用它時, return不會退出,並且腳本的 rest 將被執行並搞砸。
  • 我不能使用exit ,因為這會關閉 shell。
  • 我不能使用絕妙的技巧kill -SIGINT $$ ,因為這不允許返回退出代碼。

有沒有我忽略的可行替代方案?

問題標題的答案(不像其他答案那樣在正文中)是:

返回退出代碼而不關閉 shell

(exit 33)

如果您需要激活-e並且仍然避免使用非零退出代碼退出 shell,請執行以下操作:

(exit 33) && true

true的命令永遠不會執行,而是用於構建不會被-e shell 標志退出的復合命令。

將設置退出代碼而不退出 shell(也不是源腳本)。

對於更復雜的退出問題(使用特定的退出代碼),無論是執行還是獲取:

#!/bin/bash
[ "$BASH_SOURCE" == "$0" ] &&
    echo "This file is meant to be sourced, not executed" && 
        exit 30

return 88

如果執行,將設置退出代碼 30(帶有錯誤消息)。
如果有來源,退出代碼為 88。 將退出執行或采購而不影響調用shell

使用它而不是退出或返回:

[ $PS1 ] && return || exit;

無論來源與否都有效。

您可以使用x"${BASH_SOURCE[0]}" == x"$0"來測試腳本是否被來源或調用(如果來源為假,如果被調用則為真)並相應地returnexit

另一種選擇是使用 function 並將返回值放入其中,然后簡單地獲取腳本 (source processStatus.sh) 或調用腳本 (./processStatus.sh)。 例如,考慮 processStatus.sh 腳本,它需要向 stopProcess.sh 腳本返回一個值,但還需要在不使用源代碼的情況下與命令行分開調用(僅包括相關部分)例如:

check_process ()
{
  if [ $1 -eq "50" ]
  then
    return 1       
  else
    return 0
  fi       
}

source processStatus.sh $1
RET_VALUE=$?
if [ $RET_VALUE -ne "0" ]
then
  exit 0
fi

如果在腳本開頭使用set -e ,則可以使用return

如果您只想檢查 function 是否沒有返回錯誤,我建議您像這樣重寫您的代碼:

#!/bin/bash

set -e # exit program if encountered errors

dq2-get ()
{
  # define the function here
  # ...
  if [ $1 -eq 0 ]
  then
    return 0
  else
    return 255
  # Note that nothing will execute from this point on,
  # because `return` terminates the function.
}

# ...
# lots of code ...
# ...

# Now, the test:
# This won't exit the program.
if $(dq2-get $1); then
  echo "No errors, everything's fine"
else
  echo "ERROR: ..."
fi
# These commands execute anyway, no matter what
# `dq2-get $1` returns (i.e. {0..255}).
# extract, do some stuff
# ...

現在,如果 function dq2-get $1返回錯誤,上面的代碼將不會離開程序。 但是,由於set -e ,單獨實現 function 將退出程序。 下面的代碼描述了這種情況:

# The function below will stop the program and exit
# if it returns anything other than `0`
# since `set -e` means stop if encountered any errors.
$(dq2-get $1)
# These commands execute ONLY if `dq2-get $1` returns `0`
# extract, do some stuff
# ...

感謝您提出問題,我的情況是為某些設置source文件,但如果不滿足某些條件,則結束腳本並跳過設置操作。

我遇到了嘗試使用exit()實際上導致我的終端關閉的問題,並發現自己在這里:D

在查看了特定解決方案的選項后,我剛剛使用了類似下面的內容,我還認為如果這種方法適用於您的情況, Deepaks 的答案值得查看。

if [ -z "$REQUIRED_VAR" ]; then
  echo "please check/set \$REQUIRED_VAR ..."
  echo "skipping logic"
else
  echo "starting logic"
  doStuff()
  echo "completed logic"
fi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM