2017-02-23 14 views
0

ここに最初の投稿と、かなり新しい初心者端末を使用しています。申し訳ありませんが、いずれかの失敗のために。ディレクトリ内のファイルをメニューオプションとして一覧表示し、選択したスクリプトを実行してください。

ディレクトリにある.shファイルをリストしたいので、ファイルを選択するとファイルが実行されます。ファイルは環境変数をエクスポートするちょうど.shファイルなので、作業中の特定のジョブをロードできます。

私はスクリプトをコピーして端末に貼り付けて実行すると問題があります。

しかし、私はターミナルを介してスクリプトを実行しようとすると。それは動作しますが、環境変数を設定しません。ここにスクリプトがあります。

cd ~/nuke/pipeline/executables/ 

echo "-- JOB LIST --" 

# set the prompt used by select, replacing "#?" 
PS3="Use number to select a file or 'stop' to cancel: " 

# allow the user to choose a file 
select filename in *.sh 
do 
    # leave the loop if the user says 'stop' 
    if [[ "$REPLY" == stop ]]; then break; fi 

    # complain if no file was selected, and loop to ask again 
    if [[ "$filename" == "" ]] 
    then 
     echo "'$REPLY' is not a valid number" 
     continue 
    fi 

    # now we can use the selected file, trying to get it to run the shell script 
    . $filename 
    echo "Job Environment is $filename" 

    # it'll ask for another unless we leave the loop 
    break 
done 




#And here's whats in one of the .sh files 
export DIR=/Users/darren/nuke/pipeline 
export JOB=RnD 
export SHOT=base 
+0

?あなたが 'ソーススクリプト'または ''としてそれを呼び出さない限り。 script'では、それはサブシェルで実行され、 'の効果です。 $ filename'は失われます。 – codeforester

+0

それはそれを介して呼び出されるshoudn't。 $ファイル名? – durwood

答えて

0

ここでの問題はサブシェルです。ご存じのように、サブシェルで設定された環境変数は親に伝播しません。

質問のスクリプトをmenu.shとしましょう。これは、このラインを通って、ユーザーの選択に基づいて他のスクリプトを呼び出している:あなたはmenu.shとしてスクリプトを呼び出しているよう

. $filename 

が見えます。これはサブシェルで実行され、上記の. $filename呼び出しで設定された環境変数は終了すると失われます。それが正常に動作させるために

、あなたはとしてmenu.shを起動する必要がありますどのようにあなたのスクリプトを起動している

source /path/to/menu.sh 

または

. /path/to/menu.sh 
+0

OK、このテキスト行を追加する場所はどこですか?私はまだこれほど良いことではない。 – durwood

+0

'スクリプトを実行したときに'と言いましたが、どのコマンドを使用しましたか?あなたのスクリプトの名前が 'menu.sh'であると仮定して、' source menu.sh'を使うことをお勧めします。 – codeforester

関連する問題