我使用一個擴展使用bash源特性的腳本;你如何返回到源bash腳本?
#!/bin/bash
source someneatscriptthatendsprematurely.sh
我希望能夠從該腳本中返回而不會破壞主腳本。
使用退出中斷主腳本,返回僅在函數中有效,並且試驗$(exit 1)似乎也不起作用。
那麼,是否有可能在不打破主bash的情況下返回一個子bash腳本?
任何幫助表示讚賞!
我使用一個擴展使用bash源特性的腳本;你如何返回到源bash腳本?
#!/bin/bash
source someneatscriptthatendsprematurely.sh
我希望能夠從該腳本中返回而不會破壞主腳本。
使用退出中斷主腳本,返回僅在函數中有效,並且試驗$(exit 1)似乎也不起作用。
那麼,是否有可能在不打破主bash的情況下返回一個子bash腳本?
任何幫助表示讚賞!
您需要return
聲明:
return [n]
導致的功能與
n
指定的返回值退出。如果省略n
,則返回狀態是在函數體中執行的最後一個命令的返回狀態。如果在函數外部使用,但在.
(源)命令執行腳本期間,它會導致shell停止執行該腳本,並返回n
或返回腳本內執行的最後一個命令的退出狀態作爲退出狀態劇本。如果在函數外部使用而不是在.
執行腳本期間使用,則返回狀態爲false。任何與RETURN陷阱相關的命令都會在執行之前執行,然後在函數或腳本之後繼續執行。
您可以用以下兩個腳本動作看到這一點:
script1.sh:
. script2.sh
echo hello again
script2.sh:
echo hello
return
echo goodbye
當您運行script1.sh
,你會看到:
hello
hello again
請注意,如果可以的話,你應該默認顯式返回0。不這樣做可能會導致父腳本中出現意外行爲。即''-z「non-existant-file」] && return'實際上會返回1. – 2012-08-03 08:50:01
@BrettRyan您示例的問題在於'[-z「non-existant-file」] && return 0'將返回1 。因此,告訴人們明確地「返回0」,然後展示一個不起作用的例子,這是令人困惑的。 – Segfault 2017-11-27 17:47:25
Brett,在我發佈的示例中並沒有實際意義,因爲調用腳本沒有以任何方式實際檢查返回值(例如,通過「if」,「$?」或「set -e」) 。無論如何,我非常確定,我所包含的報價使得行爲在這種情況下變得清晰。 – paxdiablo 2017-11-28 01:22:09
是很重要的是,你可以更改環境變量?否則你可以運行它沒有源執行腳本:
someneatscriptthatendsprematurely.sh
剛纔我有同樣的問題
我意識到,加入了檢驗器功能和返回,不會也回報功能的來電者例如。
在bash_functions
function install_packer_linux() {
check_wget && check_unzip
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}
function check_unzip() {
if ! [ -x "$(command -v unzip)" ]; then
echo "Error: unzip is not installed"
return 1
else
return 0
fi
}
function check_wget() {
if ! [ -x "$(command -v wget)" ]; then
echo "Error!: wget is not installed"
return 1
else
return 0
fi
}
$ source ~/.bash_functions
這裏發生的是,因爲跳棋是其返回所以install_packer_linux仍將繼續
所以,你可以在這裏做兩件事情的唯一地方。無論是保持當前的格式(函數調用另一個函數)的值並使用truthy值,則返回值的類型不truthy或重寫主installer_packer_linux功能檢查評估
Truthy:
function install_packer_linux() {
check_wget && check_unzip || return
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}
通知我們添加||檢查後返回並連接支票使用& & 所以,如果不是兩個檢查都是真的我們返回功能
paxdiablo的答案是完美的,應該被接受。 – Tino 2014-04-22 02:42:46