2017-07-18 3 views
0

問題はプログラムへのパスを保存していないことです。どのように私はパスがわからないbashでプログラムを開きますか

#!/bin/bash 
read -p "Enter progam name: " name 
path=which $name 
nano $path 
+0

私はそれらを見るのが好きです。 –

+2

@janos 'どの'はバイナリだけでなく、どの実行可能ファイルでも動作します。 @MreeMでは 'pathname = $(which $ name)'のように 'which $ name'ビットの周りに' $() 'を使うことができます。 "' 'nano" $(which $ name) "を使用することもできます。" – JNevill

+0

@janosバッククォートの提案を削除するためにコメント/回答を更新しました。コメントanywaのコードブロック内の例をここに表示するのは難しいです。 – JNevill

答えて

-1

whichの代わりにfindを使用してください。

path=$(find /some/base/path -type f -name "${name}")

+1

OPは明示的にプログラムの名前のみを要求しています。この場合は、PATH経由での検索だけが適切であり、はるかに高速です。 –

+0

あなたの説明を詳しく説明してください、あなたが言っていることは明らかです。 – Azize

+0

OPの目的は、 'PATH'上でプログラムを見つけることです(したがって' which'を使っています)。彼らは固定 '/ some/base/path'を見ていないので、' find'を使うことはできません。 – dimo414

2
path=which $name 

これは、あなたが必要な構文ではありません。これにより、$nameに格納されたコマンドが呼び出され、その環境に変数path=whichが追加されます。 path="which $name"のように引用した場合は、ご使​​用の環境にpathを設定しますが、文字列はwhich ...(...は$nameの値)です。

あなたが探しているものは、command substitutionです。コマンドの出力をキャプチャできます。だからではなく、あなたが行う必要があります。

path="$(which "$name")" 

これは、あなたが望むものであるwhich "$name"の結果にpathを設定します。コメントで示唆したように

あなたは完全にpath変数をスキップして、ちょうど言うことができます。

nano "$(which "$name")" 

あなたも、完全にあなたが構文を思い出し、そしてちょうど入る気にしないと仮定すると、このスクリプトをスキップすることができます。

$ nano "$(which command-to-look-at)" 

プロンプトで直接。あなたはより堅牢な何かをしたい場合は

他の道を行く

、あなたはそれが機能ではなくスクリプトです気づく(このようなもので開口部binary filesを避けることができ、あなたが直接あなたの.bashrcにそれを追加したり、身体を引き出すことができます)ご希望の場合は別のスクリプトへ:

inspect_command() { 
    local name="${1:?No command provided}" 
    local path 
    path=$(which "$name") || { 
    echo "No command '$name' found" 
    return 1 
    } 
    if [[ "$(file --brief --mime-encoding "$path")" == "binary" ]]; then 
    echo "$path appears to be a binary file." 
    local response; 
    read -p "Are you sure you'd like to continue? [y/N] " response; 
    [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] || return 0 
    fi 
    "${EDITOR:-nano}" "$path" 
} 

これは、引数としてコマンドを渡し、1が設定されている場合、それはあなたの優先EDITORを使用していますが)(テキストファイルに上記と同じ動作をしますが、あなたを警告バイナリファイルを開こうとする前に。

$ inspect_command curl 
/usr/bin/curl appears to be a binary file. 
Are you sure you'd like to continue? [y/N] n 

$ inspect_command some_script.sh 
... opens nano 
+0

'nano" $(curl) ''のようなものを実行する意味はなんですか?これはバイナリファイルです。だから、普通のファイル、テキストファイル、普通のファイルを 'PATH'に入れない(nanoで編集しようとしている)と考えています。 'which'も普通のファイルのパスを取得するのに使うことができますが、この場合は' PATH'を更新する必要があります。これはまさに知られていません。 – Azize

+0

そうですね、それは必ずしも意味のあることではありません。 *バイナリではなく、検査するのが面白いプログラムはたくさんあります。 OPは上記のように "*私はちょうどそれらを見てみたい*"。 – dimo414

+0

@Azizeバイナリコマンドを正常に処理する拡張機能を追加しました。実際にスクリプトである平均 'PATH'には多くのコマンドがあります。あなたが見ていると、あなたが期待する以上のものを見つけることができると確信しています。 – dimo414

関連する問題