特定の実行可能ファイルのパスを返すには、次のように実行できます。
which mysql
たとえば、次を返します。
/usr/bin/mysql
私は戻ってきたいだけです:
/usr/bin
どうすればいいですか?
答え1
executable=mysql
executable_path=$(command -v -- "$executable") &&
dirname -- "$executable_path"
$executable
もちろん、シェル組み込み、関数、またはエイリアスの場合は機能しません。mysql
この機能が組み込まれたシェルがあるかどうかはわかりません。以前に定義していない限り、関数やエイリアスではありませんが、それを知っておく必要があります。bash
エクスポートされた関数のサポートは例外かもしれません。
$ bash -c 'command -v mysql'
/usr/bin/mysql
$ mysql='() { echo test;}' bash -c 'command -v mysql'
mysql
答え2
どの
通常、このコマンドは避けるべきです。
なぜ?
ビルド時に現在の環境を使用するため、$PATH
実行可能ファイルを見つけると評価されます。これにより、$PATH
実行時にファイルビルドの内容を使用できるシェルスクリプトなどを処理する際に混乱が発生する可能性があります。~/.bashrc
~/.bash_profile
たとえば、
# path to start
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sam/bin
# let's change it
$ export PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
# simulate a new env. for a shell script
$ bash -lc "echo \$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sam/bin
シェルスクリプトが実行されると、現在の環境ではなく元の環境があることに注意してください。
タイプ
次のコマンドを使用して、type
環境で実行可能ファイルを見つけることもできます。
$ type ls
ls is aliased to `ls --color=auto'
または、すべてを表示するには、-a
次のスイッチを使用してください。
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
type
エイリアスと場所が表示されます。しかし、ディレクトリを見つけるためにcommand
@StephaneChazelasソリューションを使用することをお勧めします。
どこ
コマンドを使用することもできますが、whereis
検索するディレクトリセットがハードコーディングされている環境は使用されません。より男たちはどこにいるの?詳細については。
場所
これは人々を混乱させる可能性がありますが、一部のディストリビューションには通常1日に1回、cronジョブで実行されるツールが含まれており、ディスク全体をスキャンしてそのコマンドを使用してlocate
検索できる小さなデータベースファイルを構築します。
/etc/cron.daily/mlocate.cron
Fedora 14 システムでは、cron ジョブが呼び出されます。- スキャンを実行するためのツールと呼ばれます
/usr/bin/updatedb
。 - DBファイルは次の場所にあります
/var/lib/mlocate/mlocate.db
。
私が考えるのに少しハッキングだと思うものを使用すると、次のような名前のファイルだけを見つけるlocate
ように欺くことができます。ls
$ locate -b '\ls'
/bin/ls
/usr/share/javadoc/java-1.6.0-openjdk/api/org/w3c/dom/ls
/usr/share/javadoc/java-1.6.0-openjdk/jre/api/plugin/dom/org/w3c/dom/ls
/usr/share/locale/l10n/ls
/var/cache/abrt-di/usr/src/debug/gcc-4.5.1-20100924/libjava/classpath/external/w3c_dom/org/w3c/dom/ls
/var/cache/abrt-di/usr/src/debug/gcc-4.5.1-20100924/libjava/classpath/gnu/xml/dom/ls
上記の方法は\
ワイルドカードを使用するために機能するため、暗黙的なls
置換は無効になります*ls*
。
よりマンページを探す詳細については。
何ですか
よく知られていないツールはですwhatis
。これはlocate
.soに似ているため、データベースでサポートされています。しかし、コマンドを見つけるのに便利です。
$ whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
このツールはcronジョブで呼び出されます/etc/cron.daily/makewhatis.cron
。ただし、そのデータベースはシステムのページに基づいてmakewhatis
構築されます。man
これについての詳細は、以下で確認できます。makewhatis のマニュアルページ。
ディレクトリ名のみ?
dirpath
上記のコマンドで生成された出力には、このコマンドを使用してディレクトリコンポーネントのみをインポートできます。
dirpath
スキャンが実行されないため、あらゆる種類のファイルパスを提供でき、ディレクトリ部分が提供されます。
$ dirname /some/path/to/a/script
/some/path/to/a
答え3
xargsを使うのはとても簡単です。
which mysql | xargs dirname
答え4
〜のように他の人持つ説明した、使用しないでくださいwhich
。
この変数を繰り返す小さなシェル関数を書くことができますPATH
。
which-directory () (
IFS=:
set -g
for d in $PATH; do
if [ -z "$d" ]; then d=.; fi
if [ -x "$d/$1" ]; then printf '%s\n' "$d"; return; fi
done
return 1
)
または を呼び出すと、command -v
エイリアスや機能、外部コマンドも報告できます。mysql
追加の引数を使用して同じ名前の外部コマンドを呼び出すエイリアスまたは関数がある場合は、定義された関数またはエイリアスのcommand -v
ない新しく起動されたシェルからそれを呼び出すことができます。これは、別名または関数が同じ名前の外部コマンドを呼び出す場合にのみ当てはまります。次の2つのシングルライナーは同じです(PATHに改行文字を含むディレクトリまたは実行可能ファイル名がないと仮定)。
dirname -- "$(sh -c 'command -v "$0"' -- mysql)"
sh -c 'command -v "$0"' -- mysql | sed -e 's!.*/!!'
zshでは、次のコード行は同じことを行います。
echo =mysql(:h)