スクリプトを呼び出すユーザーを新しい作業ディレクトリに移動するbashスクリプトがあります。
cdを使用してスクリプトを呼び出すと、ユーザーは. ./script.sh
新しいディレクトリに移動しますが、問題はスクリプトに引数が渡されない場合は、スクリプトも終了コマンドを使用してユーザーのSSHセッションを閉じることです。
スクリプトを呼び出さずにディレクトリをどのように変更できますか. ./script.sh
?または、呼び出し時にユーザーセッションを終了せずにスクリプトを終了できますか. ./script.sh
?
私が問題のあるスクリプトの部分は次のとおりです。
#!/bin/bash
VAR=$1
if [[ "$VAR" == "" ]]; then printf "No argument provided, please provide what you want to check.\n"; exit 1; fi
change_cwd () {
cd $NEWDIR
}
change_cwd
シャットダウンを呼び出すと./script.sh
期待どおりに機能しますが、ディレクトリの変更はユーザーではなくスクリプトサブシェルで行われますが、シャットダウンを. ./script.sh
使用すると、スクリプトを呼び出すユーザーのSSHセッション全体が終了します。
この問題に対する解決策は何ですか? bashスクリプトで終了とcdの両方を実行したり、ディレクトリを変更したり、スクリプトを終了したりするにはどうすればよいですか?
要点は、スクリプトにユーザーの作業ディレクトリを変更させ、引数や引数エラーがない場合は$ VARの追加チェックを追加する予定であるため、スクリプトの残りの実行を停止して次に戻る必要があります。ユーザーがスクリプトを再実行できるようにするユーザーシェル。
ベストアンサー1
スクリプトがとして呼び出されると、./script
親プロセスの現在のディレクトリを変更できません。したがって、スクリプトをとして使用する必要があります. ./script
。
return
組み込み関数を使用してスクリプトを終了し、呼び出し元に戻ることができます。これは関数の外部でのみ実行できます。関数の内部では、return
スクリプトではなく関数から返されます。
スクリプトがソースコードの場合、bashではなくユーザーシェルによって実行されるため、他のシェル(zsh、fish、tcshなど)ユーザーはスクリプトを使用できません。 bashとzshで動作するスクリプトを書くのは比較的簡単ですが(次のコマンドでスクリプトを起動するとほとんど動作しますemulate -L ksh 2>/dev/null
)、Fishとtcshでも動作するスクリプトを書くのははるかに簡単ではありません。
シェルの非互換性を解決する別の方法は、選択したプログラムに引数を解析し、変更するディレクトリを決定するロジックを作成することです。その後、プログラムは呼び出し側シェルのシェルコードを印刷し、呼び出し側にスクリプトの出力を評価させます。したがって、スクリプトは次の結果を出力できます。
cd /some/where
または
echo "Error: blah blah"; false
それは呼ばれる
eval "`./script`"
または tcsh/fish/... 類似体です。