2つの引数をcdline
受け入れてディレクトリをそのエントリに変更する短いbashスクリプトがあります。PATHS
LINE
LINE
PATHS
#!/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
ありませんbash
bash
組み込み注文する。
最も重要なのは、PATH
スクリプトで変数名を使用しないでくださいbash
。
答え2
PATH
コマンドを探す場所をシェルに伝える特別な変数なので、スクリプトで一時変数として使用しないでください。
~からman bash.1
道
コマンドの検索パスです。これは、シェルがコマンドを検索するコロンで区切られたディレクトリのリストです(以下のコマンドの実行を参照)。 PATH値の長さが0の(空の)ディレクトリ名は、現在のディレクトリを表します。空のディレクトリ名は、2 つの隣接するコロン、または先頭または末尾のコロンとして表示できます。デフォルトのパスはシステムによって異なり、bashをインストールした管理者が設定します。一般的な値は「/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin」です。