2010-09-08 34 views
35

Tôi sử dụng tập lệnh mở rộng bằng tính năng nguồn bash;Làm cách nào để bạn quay lại tập lệnh bash có nguồn gốc?

#!/bin/bash 

source someneatscriptthatendsprematurely.sh 

Tôi muốn có thể quay lại từ tập lệnh đó mà không phá vỡ tập lệnh chính.

Sử dụng dấu ngắt xuất cảnh tập lệnh chính, trả về chỉ hợp lệ trong các hàm và thử nghiệm với $ (exit 1) dường như không hoạt động.

Vì vậy, có thể trả lại trong tập lệnh phụ-bash mà không phá vỡ bash chính không?

Bất kỳ trợ giúp nào được đánh giá cao!

+0

Trả lời của paxdiablo là hoàn hảo và phải được chấp nhận. – Tino

Trả lời

52

Bạn cần báo cáo kết quả return:

return [n]

Nguyên nhân một chức năng để thoát ra với giá trị trả theo quy định của n. Nếu n bị bỏ qua, trạng thái trả về là của lệnh cuối cùng được thực hiện trong phần thân hàm. Nếu được sử dụng bên ngoài một hàm, nhưng trong khi thực thi tập lệnh bằng lệnh . (nguồn), nó làm cho trình vỏ ngừng thực thi tập lệnh đó và trả lại n hoặc trạng thái thoát của lệnh cuối cùng được thực thi trong tập lệnh dưới dạng trạng thái thoát của kịch bản. Nếu được sử dụng bên ngoài một hàm và không trong khi thực thi tập lệnh theo số ., trạng thái trả về là sai. Bất kỳ lệnh nào liên kết với bẫy RETURN được thực hiện trước khi thực thi tiếp tục lại sau hàm hoặc tập lệnh.

Bạn có thể thấy điều này trong hành động với hai kịch bản sau đây:

script1.sh: 
    . script2.sh 
    echo hello again 
script2.sh: 
    echo hello 
    return 
    echo goodbye 

Khi bạn chạy script1.sh, bạn sẽ thấy:

hello 
hello again 
+4

Lưu ý rằng bạn nên 'trả về 0' theo mặc định nếu bạn có thể. Không làm như vậy có thể gây ra hành vi không mong muốn trong tập lệnh mẹ. tức là '[-z" không tồn tại-file "] && return' sẽ thực sự trả về 1. –

+1

@BrettRyan vấn đề với ví dụ của bạn là' [-z "không tồn tại-file"] && return 0' sẽ trả về 1 Vì vậy, nói với mọi người một cách rõ ràng 'trở về 0' và sau đó hiển thị một ví dụ nơi mà không làm việc là khó hiểu. – Segfault

+0

Brett, điều đó không thực sự quan trọng trong ví dụ tôi đã đăng từ khi kịch bản gọi không thực sự kiểm tra giá trị trả về theo bất kỳ cách nào (thông qua, ví dụ: 'if',' $? 'Hoặc' set -e') . Trong mọi trường hợp, tôi khá chắc chắn báo giá tôi đưa vào làm cho hành vi rõ ràng trong trường hợp đó. – paxdiablo

1

là điều quan trọng mà bạn có thể thay đổi các biến môi trường? Vì nếu không thì bạn chỉ có thể thực thi kịch bản bằng cách thực hiện nó mà không cần nguồn:

someneatscriptthatendsprematurely.sh 
0

tôi đã cùng một vấn đề chỉ là bây giờ

tôi nhận ra rằng việc thêm một chức năng kiểm tra và gửi lại rằng sẽ không còn quay trở lại chức năng trên của nó người gọi ví dụ.

On 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 

gì xảy ra ở đây là kể từ khi cờ là nơi duy nhất của nó trở nên install_packer_linux vẫn sẽ tiếp tục

Vì vậy, bạn có thể làm hai việc ở đây.Hoặc giữ định dạng hiện tại (chức năng gọi hàm khác) như là và đánh giá sử dụng giá trị truthy sau đó trở về nếu các giá trị không phải là truthy hoặc viết lại kiểm tra về chức năng installer_packer_linux chính

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 
} 

Thông báo chúng tôi đã thêm || trả lại sau khi kiểm tra và ghép các séc bằng cách sử dụng & & vì vậy nếu không phải cả hai kiểm tra đều đúng, chúng tôi trả lại hàm

Các vấn đề liên quan