hello.sh を作って chmod +x もしたのに、hello.sh って打ったら command not found やった./hello.sh なら動く。何が違うん?
【疑問】作ったスクリプトを名前だけで実行したら command not found。PATH と type・which【LPICレベル1】
前提のおさらい。環境変数は export された変数で、子プロセスにも渡る。echo "$PATH" で中身を見られる
>>1
スラッシュを含まないコマンド名は、PATH に並んだディレクトリを左から順に探す。カレントディレクトリは普通 PATH に入ってないから見つからない
>>3
手元の結果hello.sh → hello.sh: command not found(終了ステータス127)./hello.sh → hello/tmp/lab/hello.sh → hello
>>4
./ や絶対パスみたいにスラッシュを含めると、PATH を使わずにその場所のファイルを動かす
>>3
じゃあ PATH に . を足したらええやん
>>6
やめとけ。誰かが置いた ls という名前のファイルを、うっかり実行してしまうことがある。足すならスクリプト用のディレクトリ(~/bin など)を足す
>>7export PATH="$PATH:$HOME/bin" で後ろに足す形やな
コマンドの正体を調べるのは?
>>9type は bash の組み込みコマンドで、alias・キーワード・関数・組み込み・外部コマンドのどれかを教えてくれるtype cd → cd is a shell builtintype ls → ls が ls --color=auto の alias だと表示(Debian の ~/.bashrc の設定。環境によって違う)type which → which is /usr/bin/which
>>10type -a echo だと、組み込みの echo と /usr/bin/echo の両方が出る。打つと組み込みが先に使われる
>>9which は PATH の中の実行ファイルを探すだけ。which cd は何も出さずに終了ステータス1。組み込みコマンドや alias は分からない
>>12
Debian の which の場合な。ディストリビューションによっては which 自体に alias を見せる設定がしてあることもある
>>1
今いる場所の確認は pwd か
>>14
そう。pwd も組み込みコマンド。type pwd で確かめられる
>>10
探す順番は alias → キーワード → 関数 → 組み込み → PATH の外部コマンド、と覚えとく
>>16
正確には bash の man の COMMAND EXECUTION の節。外部コマンドの場所は一度見つけると覚えておく(hash)から、移動したら hash -r
>>3
PATH にないものは ./ か絶対パス、正体は type。which は外部コマンド専用、と
管理人のひとこと
- スラッシュを含まないコマンド名は PATH のディレクトリを左から順に探す。カレントディレクトリは普通入っていないので、
./hello.shや絶対パスで実行する。PATH に . を入れるのは危ないので、~/bin などを足す。 typeは alias・キーワード・関数・組み込み・ファイルのどれかを表示し、type -aで全部の候補を出す。whichは PATH の中の実行ファイルだけを探すので、組み込みコマンド(cd・pwd など)や alias は出ない(ディストリビューションによっては which に alias を見せる設定がある)。pwdは今いるディレクトリを表示する組み込みコマンド。