cdを自動的にlsにする


47

私はしばしば次のことをすることがわかります:

%> cd bla/bla
%> ls

cdディレクトリに移動するたびに自動的にls

.bashrcはしばらくの間、いじりましたが、それを実現する方法がわかりませんでした。

回答:


51

あなたは関数でこれを行うことができます:

$ cdls() { cd "$@" && ls; }

&&「という意味cdのディレクトリに、そして成功した場合(例えばディレクトリが存在する)、実行ls」。&&演算子を使用する方;が、2つのコマンドの間にセミコロン演算子を使用するよりも優れてい{ cd "$@" ; ls; }ます。この2番目のコマンドは、動作しているlsかどうかに関係なく実行されますcdcd失敗した場合、ls現在のディレクトリの内容が出力され、ユーザーを混乱させます。ベストプラクティスとして、では&&なくを使用してください;

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

一般に、特にのような一般的に呼ばれるコマンドの場合、すでに存在するコマンドの名前を変更することは悪い習慣cdです。代わりに、別の名前で新しいコマンドを作成してください。cdまた、という名前の関数またはエイリアスで上書きした場合cd、100,000個のファイルがあるディレクトリを入力するとどうなりますか?を使用するユーティリティは多数ありcd、この異常な動作に混乱する可能性があります。共有アカウントを使用する場合(root他のシステム管理者と作業しているときなど)、環境は人々の期待とは異なるため、既存のコマンドを置き換えるのは非常に危険です。


そのコマンドは本当にディレクトリを変更しますか?bashののmanページから:「置換テキストで引数を使用するための機構がない引数が必要な場合は、シェル関数を使用する必要があります。」
enzotib

@enzotib:はい、これは本当にディレクトリを変更します、少なくとも私にとっては。回答を更新して、の出力を表示しましたpwd。これがベストプラクティスであるかどうかはわかりませんが、一般的に行われています。いくつかの例については、tldp.org / LDP / abs / html / aliases.htmlを参照してください。
ステファンLasiewski

2
まず、ここでは機能しません。2番目:そのページでは、位置パラメーターではなく変数を使用します。第三に:ABSは悪い習慣の一般的な原因です。
enzotib

1
エイリアスはSnow Leopardでは機能しますが、CentOS5またはCentOS6では機能しません。関数のみを使用するように回答を更新しました。エイリアスなし。
ステファンLasiewski

1
私にはうまくいきません。@frabjous答えをしようと、それが動作します:cd() { builtin cd "$@" && pwd; };- MacOSの(シエラ10.12.6)で、標準のBourneシェルを使用して
スイベル

39

.bashrcにこれがあり、正常に動作します。

function cd {
    builtin cd "$@" && ls -F
    }

以前の.bashrcには[ -z "$PS1" ] && return、があり、その行以降はすべて対話型セッションにのみ適用されるため、これはcdスクリプトでの動作に影響しません。


1
正確には何をし[ -z "$PS1" ] && returnますか?
シンタグマ

2
[ -z "$PS1" ]$PS(対話式プロンプト変数)が「長さゼロ」(-z)かどうかを確認します。長さがゼロの場合、これは設定されていないことを意味するため、Bashを対話モードで実行しないでください。&& return一部には、調達から出て.bashrc、これらの条件の下で、この時点で。
派手な

1
対話性をチェックする別の方法は以下を探すことiです"$-"case "$-" in *i*) ;; *) return ;; esac
クサラナンダ

@Kusalananda&frabjous:片方をもう一方の代わりに使用する必要がある場合はありますか?
スイベル

1
@Swivel PS1変数は設定されていないか空である可能性があり、シェルは引き続き対話的である場合があります(ただし、プロンプトは表示されません)。確認$-するためにチェックします。
クサラナナンダ

13

質問は/ bashとタグ付けされていますが、bashに言及していないこの質問の複製としていくつかの質問が閉じられているため、トピック外です。

zshの場合:

chpwd() ls

chpwd()関数は、現在のディレクトリが変更されるたびにzshによって呼び出されます(cd、pushd、popdなど)。tcshにも同様の機能があり、おそらくzshが入手した場所です。


4

エイリアスを.bashrcファイルに追加してみませんか?

何かのようなもの:

alias cdls='cd "$@" && ls'

@don_crissti機能とエイリアスは別のものです。それではなぜですか?
ジョッカレモン

これは、OPが要求したことを行う最も迅速でクリーンな方法です。私の意見では、関数はより複雑なことに使用する必要がありますが、よく入力されるコマンドのショートカットを作成することは、まさにエイリアスの存在です。
Ghos3t

1
このエイリアスには奇妙な問題があります.cdls projec2のように使用すると、プロジェクト2フォルダー内のすべてのファイルが表示されますが、実際にはそのフォルダーにcdではなく、元のフォルダーに残ります。
Ghos3t

うん、エイリアスを使用すると、そのディレクトリの内容が一覧表示されるだけですが、実際にはそこにcdすることはありません。
a3y3

2

cdコマンドのエイリアスを作成する一般的なソリューションは、popdなどの現在のディレクトリを変更したり、cdコマンドを含むスクリプトを実行したりする他のコマンドがあるため、完全ではありません。

プロンプトを返す前にコマンドを実行する$ PROMPT_COMMAND Bashフックを使用することをお勧めします。

このコマンド(この場合は関数)は、ディレクトリが画面ノイズを減らすために変更された場合にのみlsを実行します。.bashrcのコード:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd


1

bashでは、パラメーターを必要とするアクションのエイリアスに再帰することはできません。このための機能があります。だからあなた~/.bashrcの次の

mycd() {
  cd "$1"
  ls
}


lsコマンドのパラメーターを許可するには、関数mycd {builtin cd $ 1 && ls $ 2}を使用します。今、あなたは、例えばmycd .. -laコマンドを呼び出すことができます
クリスチャンSchulzendorff

@ChristianSchulzendorff:引用符を使用することをお勧めしますfunction mycd { builtin cd "$1" && ls "$2" }
-enzotib

動作しません、私はちょうどそれを試しました。ファイルは空でしたが、コードを追加しても何も変わりませんでした。
ブラック

0

.profileに以下のコードを配置すると、機能します。HP-Unixボックスでテスト済み。

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

さらに便利- 歴史に戻ることができます

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

ディレクトリを変更すると、次の行Stack: (current_dir) (previous_dir) ...が表示され、ls出力されます。dirsの履歴に戻るには、次のコマンドをポップしますpopd

else間違ったディレクトリに移動しようとするとエラーが表示されるように追加しました。


cdを実行するだけで、最後に使用したディレクトリに移動します
イアン

0

lsオプションを使用しcdないため、この方法でのオプションを有効にすることをお勧めします。

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

うーん... cdオプションを取ります。
クサラナンダ

0

ここに私が役に立つと思うものがあります(Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

これにより、そのディレクトリ内のアイテムが多すぎてコンソールがクリーンに保たれる場合に、省略記号付きの出力が切り捨てられます。

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

これは、他の答えがまだカバーしていないことを追加しません。
-jasonwryan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.