web-dev-qa-db-ja.com

コマンドラインに組み込まれている「cd」コマンドを上書きすることは可能ですか?

コマンドライン(bash)を使用して自分のマシン(この場合はMac OS X 10.6.7)の別のディレクトリに「cd」するたびに、すぐに「ls」と入力してコンテンツのリストを取得しますそのディレクトリに。 「cd」をオーバーライドして、要求されたディレクトリに変更し、リストを一度に表示する方法を見つけようとしています。

〜/ .bash_profileに次の行を追加することで、私が探している基本的な機能を取得できました

function cl() { cd "$@"; ls -l; }

これは期待どおりに機能します。要求されたディレクトリに変更してから、コンテンツを表示します。問題が発生するのは、新しい「cl」コマンドを作成するのではなく、「cd」自体をオーバーライドしようとする場合です。

以下のものしないでください機能

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

また、リストされていない他のいくつかの反復を試し、機能する 'cl'関数を指すエイリアスを作成しました。どれもうまくいきませんでした。

私がドキュメンテーションで読んだことは、「cd」が外部コマンドとして実行できないという事実について述べています(これは、関数がそれを使用する必要がある方法であると私が理解しているものです)。

そのため、現在「cl」コマンドを使用して必要なものを取得できますが、質問は次のとおりです。

「cd」の動作をオーバーライドして、要求されたディレクトリに変更し、後で何かを行う方法はありますか?

23
Alan W. Smith

以下はうまくいくはずです:

function cd() { builtin cd "$@" && ls -l; }

関数は1行にあるので、正しく機能するために、上記のように;で終了していることを確認してください。

30
Gaff

あなたはループに陥っていると思います。 cd関数がcdを呼び出しています。これは...関数です。

builtinについて知っておく必要があります。これは、コマンドの検索で、関数ではなくcdのようなBashビルトインを使用するためのキーワードです。

function cd
{
    builtin cd "$1"
    : do something else
}

また、/usr/bin/cdは、そのようなコマンドが存在しても機能しません。

どうなるでしょう:

  • 私のBashシェルはdir/bash/dir
  • コマンドを実行します/usr/bin/cd /dir/for/cd
  • /usr/bin/cdはdirに移動します/dir/for/cd
  • /usr/bin/cdは終了します。
  • バッシュはまだ/bash/dir、子プロセス/usr/bin/cdは親に影響を与えることはできません。

また、エイリアスは単純なテキスト置換です。それらがパラメータを持つことはありません。

11
Rich Homolka

たとえば、rvmなど、「cd」関数をハイジャックする他のスクリプトがあるため、cdをオーバーライドしないことをお勧めします。代わりに「d」などの別の名前を選択し、関数に「組み込み」タイプを指定しない方がよいでしょう。そうしないと、ハイジャッカーが機能しません。以下のコードを使用しています:

function d() { cd "$@" && ls;} 
6
Wen