私はもともと私の同僚がbashシェル用に書いたこのスクリプトを動作させようとしています。計画はzshシェルからインポートすることです。私が理解したのは、このスクリプトを使用すると、端末を介してそのディレクトリに保存されているヘルパースクリプトにアクセスできます。ただし、この手順を実行すると、エラーメッセージが引き続き表示されます。
次${BASH_SOURCE[0]}
の質問に答えて、次の解決策を試しました。${(%):-%N
${(%):-%x}
ここから。
PATHNAME="$_";
if [[ "$PATHNAME" != "$0" ]]; then
export EXAMPLE_DIR=$(dirname $(dirname $(realpath ${BASH_SOURCE[0]})));
else
>&2 echo "This script should be sourced, not executed in a subshell";
fi
なぜエラーが発生し続けるのか理解できず、問題が何であるかを知りたいです。どんな助けや読書リンクにも感謝します!
答え1
$_
BashとZshが異なるため、エラーが発生します。
$_
(アンダースコア)シェルの起動時に絶対パス名に設定され、実行中のシェルまたは環境または引数のリストに渡されたシェルスクリプトを呼び出すために使用されます。その後、拡張後、フォアグラウンドで実行された前の単純コマンドの最後の引数に展開されます。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。メールを確認すると、このパラメーターにはメールファイルの名前が保持されます。
次のようにブロックを再構築する必要があります。
if [[ -z ${(M)zsh_eval_context:#file} ]]; then
print -u2 $0:A should be sourced, not executed in a subshell.
return 1
fi
export EXAMPLE_DIR=$0:A:h:h
$zsh_eval_context
file
この単語は、ファイルから直接コードを読み取るとき(たとえば、組み込み関数を使用するとき)に含まれますsource
。
${(M)zsh_eval_context:#file}
$zsh_eval_context
単語が含まれていない場合は、長さ0の文字列として評価されますfile
。
print -u2
標準エラーで印刷します。
$0
ソーススクリプトのファイル名。:A
(「絶対」を表す)ファイル名を絶対パスに変換し、結果realpath
(利用可能な場合)を渡してシンボリックリンクを確認します。:h
("head"の場合)はと同じことを行いますdirname
が、この外部コマンドは実際には必要ありません。