Bashスクリプトをインポートした後、コマンドが見つかりません

Bashスクリプトをインポートした後、コマンドが見つかりません

2つの引数をcdline受け入れてディレクトリをそのエントリに変更する短いbashスクリプトがあります。PATHSLINELINEPATHS

#!/bin/bash
#command for changing directory to that in the given line...
#or that of the file in the given line

PATHS=$1
LINE=$2
PATH="$(echo "${PATHS}" | sed -n ${LINE}p)"
PATH="$(/home/gohomology/Scripts/pc_macros/file_system/getdir "${PATH}")"
cd ${PATH}

return 1

これを呼び出すと、ディレクトリの場合は指定getdirされたパスがエコーされ、それ以外の場合はファイルを含むディレクトリがエコーされます。

Bashスクリプトが呼び出されると、通常はサブシェルが生成されるため、スクリプトを呼び出しても通常は何もしません。私が理解しているのは、スクリプトを呼び出す前に追加または.追加できるスクリプトをソーシングすることが解決策でなければなりません。source

この方法はディレクトリの変更には機能しますが、そうした後は、ターミナルエミュレータの次の結果に示すように、ターミナル内のコマンドなどのさまざまなlsコマンドを見つけることができません。find

gohomology@gohomology:~/Desktop$ find . -name "example_file"
./example_dir/example_file

gohomology@gohomology:~/Desktop$ . cdline "$(!!)" 1
. cdline "$(find . -name "example_file")" 1

gohomology@gohomology:~/Desktop/example_dir$ ls
Command 'ls' is available in the following places
 * /bin/ls
 * /usr/bin/ls
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
ls: command not found

gohomology@gohomology:~/Desktop/example_dir$ find . -name "example_file"
Command 'find' is available in the following places
 * /bin/find
 * /usr/bin/find
The command could not be located because '/bin:/usr/bin' is not included in the PATH environment variable.
find: command not found

cdコマンドは使用後も有効ですcdline。問題は、私がbashシェルに閉じ込められているということです。だからreturn 1最後には、cdline問題は持続します。

私はUbuntu 22.04.2でbash 5.1.16とgnome-terminalを実行しています。

答え1

問題は、スクリプトがPATH環境変数をオーバーライドすることです。

PATH="$(echo "${PATHS}" | sed -n ${LINE}p)"
PATH="$(/home/gohomology/Scripts/pc_macros/file_system/getdir "${PATH}")"

マニュアルページを見ると、bashこの変数がどの用途に使用されているかがわかります。

コマンドの検索パスです。これは、シェルがコマンドを検索するディレクトリのコロンで区切られたリストです(参照:コマンドの実行次のような)。

そして後でコマンドの実行部分:

名前がシェル関数でも組み込み関数でもなく、スラッシュを含まない場合は、強く打つ各要素の検索この名前の実行可能ファイルを含むディレクトリ。

ディレクトリPATHを上書きし、現在の作業ディレクトリのみを含めるので、bashコマンドがどこにあるのかわかりません。

表示されるエラーは問題を明確に示しています。

The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.

あなたが成功した理由cdは、これが実行中の実行可能ファイルではcdありませんbashbash 組み込み注文する。

最も重要なのは、PATHスクリプトで変数名を使用しないでくださいbash

答え2

PATHコマンドを探す場所をシェルに伝える特別な変数なので、スクリプトで一時変数として使用しないでください。

~からman bash.1

コマンドの検索パスです。これは、シェルがコマンドを検索するコロンで区切られたディレクトリのリストです(以下のコマンドの実行を参照)。 PATH値の長さが0の(空の)ディレクトリ名は、現在のディレクトリを表します。空のディレクトリ名は、2 つの隣接するコロン、または先頭または末尾のコロンとして表示できます。デフォルトのパスはシステムによって異なり、bashをインストールした管理者が設定します。一般的な値は「/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin」です。

関連情報