私は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
現在のシェルを置き換えるには実行可能ファイルが必要なので、組み込みコマンドは使用されません。これはバックグラウンドで実行されるため、現在のシェルの代わりに分岐したバックグラウンドシェルを置き換えることができます。
答え2
おそらくあなたが望むことを行う最も簡単な方法は線を引くことです。
alias kill="/bin/kill"
あなたのファイルに~/.bashrc
。その後、bashのすべての新しいログイン/呼び出しは"kill"を/bin/kill
。
答え3
少し入力が必要な解決策を知っていて、入力が少ない必要がある解決策が必要な場合は、次のようにビルドしてください。
runFile() { local cmd="$1"; shift; cmd="$(which "$cmd")" && "$cmd" "$@"; }
コンピュータは通常、少しの努力が必要な作業を短縮するのに堪能です。
答え4
(zsh で) コマンド名の前に = 記号を追加すると、組み込みバージョンではなくシステムバージョンを取得できます。これは、特定のシナリオで混乱を引き起こす可能性があるエイリアスを防ぐ便利な方法でもあります。
$ =kill -p httpd