1

バックグラウンド:

この質問は、bash スクリプトまたはエイリアスで cd コマンドを使用することに関するものです。

ここに関連する SO の質問があります: bash シェル スクリプトで "cd" が機能しないのはなぜですか?

問題:

引数を渡すと、ディレクトリへのパスを stdout に送信する「foopath」という bash プログラムがあるとします。たとえば、

  $> /usr/bin/foopath 1998      ## returns /some/long/path/here/1998
  $> /usr/bin/foopath 80817     ## returns /totally/different/path/80817/files

foopath プログラムは単にルックアップを行い、ユーザーが渡した引数に基づいて見つけることができる最も近いパスを返します。

質問:

1) .bash_profile で関数とエイリアスを作成して、ユーザーが次のことができるようにするにはどうすればよいでしょうか。

  • 1a) typefoo 1998またはfoo 80817(foopath コマンドの短縮目標)
  • 1b)cd foo 1998またはcd foo 80817(ディレクトリ変更の目標)を使用してディレクトリを変更する
  • 1c) コマンド プロンプトからディレクトリを変更します (単なるサブシェルのみの目標ではありません)。

落とし穴

上記の 1c の目的のために、この一見単純な作業は面倒です。つまり、関数/エイリアスは、関連する SO 投稿の例に示されているように、インタラクティブに使用できる必要があります。.

4

2 に答える 2

1

1a)

foo () {
    cd "$(foopath $1)"
}

1b)

cd () {
    case $1 in     
      (foo) builtin cd "$(foopath $2)";;
      (*)   builtin cd "$@";;
    esac
}

1c) 1a) と 1b) の両方をインタラクティブに使用できます。

于 2013-05-13T11:01:26.890 に答える
1

解決策は次のいずれかです

  1. 代わりにスクリプトを関数にすることによって

    function script() 
    {
         cd "$(foopath "$*")"
    }
    
  2. source script.sh代わりに(または)を使用. script.shすると、スクリプトは呼び出し元のシェルで実行されます。

于 2013-05-13T11:02:20.960 に答える