cd ~foo
と入力すると、bashがfoo
の完全なディレクトリパスを入力するためのショートカットとしてfoo
に移動します。 cp ~foo/bar.txt ~/bar.txt
から/foo/
ディレクトリからホームディレクトリにファイルをコピーできるようにしたいので、基本的には、~/
とまったく同じように機能するものが必要です。しかし、ディレクトリを指定する必要があります。 [私はjfgiを使うべきだと確信していますが、何をfgすべきかわかりません]
私がこれを行うために使用した方法は、ショートカットにしたいディレクトリへのシンボリックリンクを含むディレクトリを作成し、そのディレクトリを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"
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
_
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
}
方法は、必要なパスに~c
を置き換えるcdのエイリアスを作成することです。または単にzshを使用してください;)
ディレクトリを変更するには、wcdを使用できます: Wherever Change Directory
これで、wcd plugin_root
のようになります。
その場でエイリアスを作成する以下の関数があります、
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にも保存するバージョンを持っています。これはどのシェルでも機能します。