web-dev-qa-db-ja.com

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

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

29
Seamus

私がこれを行うために使用した方法は、ショートカットにしたいディレクトリへのシンボリックリンクを含むディレクトリを作成し、そのディレクトリを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"
39
Michael Mrozek

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

bashで:

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

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

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

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

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に追加するか、そこから取得)を使用すると、ブックマークをブックマークファイルに追加したり、ブックマークファイルから削除したりできます。これはかなり新しいものであり、バグがないことが保証されていません。

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
}
2
varactyl

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

0
krissi

ディレクトリを変更するには、wcdを使用できます: Wherever Change Directory

これで、wcd plugin_rootのようになります。

0
alex

その場でエイリアスを作成する以下の関数があります、

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にも保存するバージョンを持っています。これはどのシェルでも機能します。

0
balki