bashディレクトリのショートカット


28

私がタイプするときcd ~foo、私はbashがfooの完全なディレクトリパスをタイプするためのショートカットとして私を何らかのディレクトリに連れて行って欲しいですfoo。そしてcp ~foo/bar.txt ~/bar.txt/foo/ディレクトリからホームディレクトリにファイルをコピーできるようにしたいので...基本的に、私~/はまったく同じように機能するものが欲しいのですが、ディレクトリがどうあるべきかを指定します。[私はjfgiをすべきだと確信していますが、何をfgすべきかわかりません]


zshにはこれが組み込まれています。「名前付きディレクトリ」と呼ばれる
Sildoreth

長い間シェルブックマークツールを探していましたが、最終的には、私が以前見た他のどんなものよりも好きな、独自の(ファジー検索ベースの)ソリューションになりました。この答えを確認してください:unix.stackexchange.com/a/209892/46011
ドミトリーフランク

回答:


39

私がこれを行うために使用した方法は、ショートカットにしたいディレクトリへのシンボリックリンクを含むディレクトリを作成し、そのディレクトリをCDPATHに追加することです。CDPATHはcdディレクトリを切り替えるときにどこを検索するかを制御するため、シンボリックリンクのディレクトリがCDPATHにある場合cdは、すぐにシンボリックリンクされたディレクトリのいずれかにアクセスできます。

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

もちろん、デメリットは、現在のディレクトリに「b」という名前のディレクトリがあると機能しないことです。これはCDPATHよりも優先されます。


私は通常、「最初にシェルを切り替える必要がある」という回答を嫌いますが、代わりにそれを使用する場合は、この正確な機能がZSHに存在します。名前付きディレクトリと呼ばます。変数をエクスポートし、それfooを参照~fooすると、の値に解決されます$foo。これは、次のコマンド以外でも機能するため、特に便利ですcd

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
このZSH機能は、実行とはどのような点で異なります。echo hi> / tmp / test; export t = / tmp; cat $ t / test少なくとも私のマシンでは、これは問題なく動作します。唯一の違いは、入力する必要がある文字です。
スティーブンD

opをzshに参照するのは正しいことです。私は15年に一度その機能を見逃していません。他の人が気にしない一方で、一部の人々が本当に取りつかれているようなもののように思えます。それが複数のシェルがある理由です。

2
@Stevenかなり似ていますが、ZSHはこの場合名前付きディレクトリであることを知っているので、プロンプト拡張とシェル組み込みコマンドで特別に処理できます
Michael Mrozek

... [私はほとんど(私はターミナルを使用する場合、その者がいるため)、私はZSHソリューションアウトそのルールを推測し、このシェルはMx emacsの使用してやっていると思います]
シェイマス

1
それを私の.zshrcに追加しましたが、うまくいきました。
シーマス

10

ラッパー関数を作成し、cdそれを「cd」と呼ぶことができます(最終的に関数はbuiltin cd- builtinキーワードを使用して呼び出します)。関数が見る前にコマンドラインでBashが展開せず、ディレクトリ名の最初の文字(おそらく「:」)として表示される可能性が低いプレフィックス文字を使用できます。もっと堅牢にしたいのですが、簡単な概要を以下に示します。

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
これは本当に良いアイデアです
マイケルMrozek

この提案をありがとう-その上に私の本当に簡単な解決策を作りました:aaverin.github.io/unix/macox/2014/05/26/bash-named-folders
AAverin

7

bashの場合:

~fooユーザーfooのホームディレクトリ用に予約されています。そのためだけにユーザーを作成することはお勧めしません。

環境変数を設定することにより、ディレクトリ変更するときにあなたの人生をより簡単に(または難しく)することができCDPATHます(それを調べてくださいbash(1))。

それとは別に、考える唯一の方法は、短縮したいディレクトリの環境変数を設定することです。

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

Bash変数を使用して、ブックマークシステムを作成できます。変数はどのコマンドでも機能し、bashは変数名をタブ補完します。bashの新しいバージョンでは、変数名に/が追加されている場合、変数に含まれるパスもタブ補完することができます。

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

永続化するために、変数宣言は.bashrcをソースとするファイルに保存できます。このファイルはbashスクリプトであるため、などの他の変数を参照する宣言aur="${HOME}/AUR"、または特定のホストif [[ $HOSTNAME == foo ]]; then bar=baz; fiでのみ実行される宣言を含めることができます。これは、複数のホストおよびユーザー間で構成ファイルを再利用する場合に役立ちます。

次のbash関数(.bashrcに追加するか、.bashrcから取得する)を使用すると、ブックマークをブックマークファイルに追加したり、ブックマークファイルから削除したりできます。これはかなり新しく、バグがないことを保証するものではありません。

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

方法は~c、希望するパスに置き換えるcdのエイリアスを作成することです。または、単にzshを使用してください;)


2
はい、エイリアス〜c = "cd / daten / cvs / plugin_root"のように、それを行うことを考えましたが、それはcdでのみ役立ちますが、名前付きディレクトリはすべてのコマンドで使用できます。
fschmitt


0

私はその場でエイリアスを作成する以下の関数を持っています、

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

ディレクトリをブックマークしたいときは、単にタイプしs dirNameます。これにより、などのエイリアスが作成されますalias dirName="cd /my/current/directory/;pwd"。を入力するだけで、このディレクトリに戻ることができますdirName。bash_aliasesに保存するバージョンもあります。これはどのシェルでも機能します。

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