フルパスを指定せずに、組み込み Bash の代わりにシステムコマンドを使用します。

フルパスを指定せずに、組み込み Bash の代わりにシステムコマンドを使用します。

私はBashを対話型シェルとして使用しており、Bashにシェル組み込みの代わりに(同じ名前を共有する場合)システムコマンドを実行する簡単な方法があるかどうか疑問に思います。

たとえば、シグナルを送信するのではなく、指定されたプロセスのプロセスID(pid)を印刷するには、system kill(from)を使用します。util-linux

$ /bin/kill -p httpd
2617
...

システムコマンドのフルパスを指定しない場合、システムコマンドの代わりに Bash 組み込みコマンドが使用されます。組み込みkillコマンドにはこのオプションがないため、-pコマンドは失敗します。

$ kill -p httpd
bash: kill: p: invalid signal specification

私は次にリストされた答えを試しました。Bashにシェル組み込みコマンドの代わりに外部 `time`コマンドを使用させる。しかし、ほとんどはtime実際にはシェルがあるので動作します。キーワード– 殻ではない組み込み

組み込みの Bash を一時的に無効にすることに加えて、enable -n killこれまで見てきた最良の解決策は、次のものを使用することです。

$(which kill) -p httpd

シェル組み込みの代わりに外部コマンドを実行するより簡単な(入力回数が少ない)方法はありますか?

これはkill単なる例であることに注意してください。一般化command回避策は、組み込みプレフィックスを使用して外部コマンドと同じ名前の関数の実行を防ぐ方法と似ています。私は通常、新しいプロセスをフォークするコストを節約するので、ほとんどの場合、組み込みバージョンを使用することを好み、時には組み込みバージョンに外部コマンドが提供しない機能があります。

ベストアンサー1

envあなたのルートからの仮定:

env kill -p http

env(おそらく)変更された環境では、最初の引数と呼ばれる実行可能ファイルを実行するため、シェル組み込み機能がわからないか使用されません。

これにより、一部のシェルジョブ制御の問題が発生しますが、外部コマンドに依存しません。

exec kill -p bash &

exec現在のシェルを置き換えるには実行可能ファイルが必要なので、組み込みコマンドは使用されません。これはバックグラウンドで実行されるため、現在のシェルの代わりに分岐したバックグラウンドシェルを置き換えることができます。

おすすめ記事