5

次のことを行う Bash で見つからないハンドルを作成しようとしています。

  1. $1 が存在し、それがディレクトリの場合は、cdその中に。
  2. $1 がユーザー定義ディレクトリ内に存在する場合$DEV_DIR、`cd でそこに移動します。
  3. 前の条件が当てはまらない場合は、失敗します。

今、私はこのようなものを持っています:

export DEV_DIR=/Users/federico/programacion/

function command_not_found_handle () {
    if [ -d $1 ]; then          # the dir exists in '.'
        cd $1
    else
        to=$DEV_DIR$1
        if [ -d $to ]; then
            cd $to
            echo `pwd`
        else
            echo "${1}: command not found"
        fi
    fi
}

動作しているように見えますが (echo pwdコマンドは予想されるディレクトリを出力します)、実際のシェルのディレクトリは変更されません。

.bashrcこれはシェル内の関数であるため、フォークせず、実行できるという印象を受けましたcdが、明らかに機能していません。これを解決する方法についてのヒントをいただければ幸いです。

4

4 に答える 4

3

何が起こっているのかと思うと、シェルはリダイレクトfork()設定した後、コマンドを探す前に s を実行するためcommand_not_found_handle、インタラクティブなシェルプロセスに影響を与えることはできません。

于 2011-03-20T17:49:51.650 に答える
1

あなたがやりたいと思われることは、autocd機能を使用して部分的に可能になるかもしれません:

shopt -s autocd

からman bash:

autocd - 設定されている場合、ディレクトリの名前であるコマンド名は、cd コマンドの引数であるかのように実行されます。このオプションは、インタラクティブ シェルでのみ使用されます。

それ以外の場合は、使用しようとしているアクションを実行する名前で呼び出す関数を作成するだけcommand_not_found_handleです。

于 2011-03-20T21:39:22.413 に答える
0

このプログラムをメイン シェルでスクリプトとして実行しても、実行時にサブシェルが作成されるため、ディレクトリは変更されません。現在のシェルでスクリプトをソースすると、目的の効果が得られます。

~/wbailey> source command_not_found.sh

とはいえ、次のようにしても同じ結果が得られると思います。

wesbailey@feynman:~/code_katas> cd xxx 2> /dev/null || cd ..; pwd
/Users/wesbailey

「..」をenv varで定義されたディレクトリに置き換え、.bashrcファイルにエイリアスを作成するだけです。

于 2011-03-20T17:55:27.760 に答える