2010-09-08 102 views
35

我使用一個擴展使用bash源特性的腳本;你如何返回到源bash腳本?

#!/bin/bash 

source someneatscriptthatendsprematurely.sh 

我希望能夠從該腳本中返回而不會破壞主腳本。

使用退出中斷主腳本,返回僅在函數中有效,並且試驗$(exit 1)似乎也不起作用。

那麼,是否有可能在不打破主bash的情況下返回一個子bash腳本?

任何幫助表示讚賞!

+0

paxdiablo的答案是完美的,應該被接受。 – Tino 2014-04-22 02:42:46

回答

52

您需要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 
+4

請注意,如果可以的話,你應該默認顯式返回0。不這樣做可能會導致父腳本中出現意外行爲。即''-z「non-existant-file」] && return'實際上會返回1. – 2012-08-03 08:50:01

+1

@BrettRyan您示例的問題在於'[-z「non-existant-file」] && return 0'將返回1 。因此,告訴人們明確地「返回0」,然後展示一個不起作用的例子,這是令人困惑的。 – Segfault 2017-11-27 17:47:25

+0

Brett,在我發佈的示例中並沒有實際意義,因爲調用腳本沒有以任何方式實際檢查返回值(例如,通過「if」,「$?」或「set -e」) 。無論如何,我非常確定,我所包含的報價使得行爲在這種情況下變得清晰。 – paxdiablo 2017-11-28 01:22:09

1

是很重要的是,你可以更改環境變量?否則你可以運行它沒有源執行腳本:

someneatscriptthatendsprematurely.sh 
0

剛纔我有同樣的問題

我意識到,加入了檢驗器功能和返回,不會也回報功能的來電者例如。

在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 
} 

通知我們添加||檢查後返回並連接支票使用& & 所以,如果不是兩個檢查都是真的我們返回功能