読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】作ったスクリプトを名前だけで実行したら command not found。PATH と type・which【LPICレベル1】

18レスカテゴリ:Linux
1: 名無しさん

hello.sh を作って chmod +x もしたのに、hello.sh って打ったら command not found やった
./hello.sh なら動く。何が違うん?

2: 名無しさん

前提のおさらい。環境変数は export された変数で、子プロセスにも渡る。echo "$PATH" で中身を見られる

3: 名無しさん

>>1
スラッシュを含まないコマンド名は、PATH に並んだディレクトリを左から順に探す。カレントディレクトリは普通 PATH に入ってないから見つからない

4: 名無しさん

>>3
手元の結果
hello.sh → hello.sh: command not found(終了ステータス127)
./hello.sh → hello
/tmp/lab/hello.sh → hello

5: 名無しさん

>>4
./ や絶対パスみたいにスラッシュを含めると、PATH を使わずにその場所のファイルを動かす

6: 名無しさん

>>3
じゃあ PATH に . を足したらええやん

7: 名無しさん

>>6
やめとけ。誰かが置いた ls という名前のファイルを、うっかり実行してしまうことがある。足すならスクリプト用のディレクトリ(~/bin など)を足す

8: 名無しさん

>>7
export PATH="$PATH:$HOME/bin" で後ろに足す形やな

9: 名無しさん

コマンドの正体を調べるのは?

10: 名無しさん

>>9
type は bash の組み込みコマンドで、alias・キーワード・関数・組み込み・外部コマンドのどれかを教えてくれる
type cd → cd is a shell builtin
type ls → ls が ls --color=auto の alias だと表示(Debian の ~/.bashrc の設定。環境によって違う)
type which → which is /usr/bin/which

11: 名無しさん

>>10
type -a echo だと、組み込みの echo と /usr/bin/echo の両方が出る。打つと組み込みが先に使われる

12: 名無しさん

>>9
which は PATH の中の実行ファイルを探すだけ。which cd は何も出さずに終了ステータス1。組み込みコマンドや alias は分からない

13: 名無しさん

>>12
Debian の which の場合な。ディストリビューションによっては which 自体に alias を見せる設定がしてあることもある

14: 名無しさん

>>1
今いる場所の確認は pwd か

15: 名無しさん

>>14
そう。pwd も組み込みコマンド。type pwd で確かめられる

16: 名無しさん

>>10
探す順番は alias → キーワード → 関数 → 組み込み → PATH の外部コマンド、と覚えとく

17: 名無しさん

>>16
正確には bash の man の COMMAND EXECUTION の節。外部コマンドの場所は一度見つけると覚えておく(hash)から、移動したら hash -r

18: 名無しさん

>>3
PATH にないものは ./ か絶対パス、正体は type。which は外部コマンド専用、と

管理人のひとこと