Quando digito cd ~foo
, Gostaria que o bash me levasse a algum diretório foo
como um atalho para digitar o caminho completo do diretório de foo
. e eu gostaria de poder cp ~foo/bar.txt ~/bar.txt
para copiar um arquivo do /foo/
diretório para o diretório home ... Então, basicamente, eu quero algo que funcione exatamente como ~/
sim, mas onde eu especifico qual deve ser o diretório. [Tenho certeza que devo jfgi, mas não sei o que fazer]
O jeito que eu costumava fazer isso é criar um diretório que contenha links simbólicos para os diretórios que você deseja que os atalhos e adicionar esse diretório ao seu CDPATH. O CDPATH controla onde cd
pesquisará quando você alternar diretórios, portanto, se esse diretório de links simbólicos estiver no seu CDPATH, você poderá cd
para qualquer um dos diretórios vinculados instantaneamente:
mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b # Switches to /usr/bin
A desvantagem, claro, é que não funcionará se houver um diretório em seu diretório atual chamado "b" - que tenha precedência sobre o CDPATH
Normalmente não gosto de respostas que digam "primeiro é preciso trocar de concha", mas esse recurso exato existe em ZSH , se você está disposto a usar isso; é chamado de diretórios nomeados . Você exporta uma variável foo
e, quando se refere a ~foo
resolve para o valor de $foo
. Isso é especialmente conveniente porque funciona em comandos além de cd
:
echo hi > /tmp/test
export t=/tmp
cat ~t/test # Outputs "hi"
Você pode escrever uma função de wrapper para cd
e chamá-la de "cd" (no final, a função chamará builtin cd
- usando a palavra-chave builtin
). Você pode usar um caractere de prefixo que o Bash não expandirá na linha de comando antes que sua função o veja e é improvável que apareça como o caractere inicial nos nomes dos diretórios, talvez ":". Você gostaria de torná-lo mais robusto, mas aqui está um esboço simples:
# 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
com bash:
~foo
Está reservado para o diretório inicial do usuário foo. Eu não recomendaria a criação de usuários apenas para essa conveniência.
Você pode tornar sua vida mais fácil (ou mais difícil) quando alterando diretórios configurando a variável de ambiente CDPATH
(procure em bash(1)
).
Além disso, a única maneira de pensar seria definir variáveis de ambiente para os diretórios que você deseja abreviar.
$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR
As variáveis bash podem ser usadas para criar um sistema de favoritos. As variáveis funcionarão com qualquer comando e o bash completará o nome da variável. Nas versões mais recentes do bash, se a/for anexado ao nome da variável, o caminho que a variável contém também pode ser preenchido com tabulação.
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).
Para persistência, as declarações de variáveis podem ser mantidas em um arquivo originário de .bashrc. Como esse arquivo é um script bash, ele pode conter declarações que fazem referência a outras variáveis, como aur="${HOME}/AUR"
, ou que são executados apenas em determinados hosts if [[ $HOSTNAME == foo ]]; then bar=baz; fi
, que é útil se você reutilizar arquivos de configuração em vários hosts e usuários.
A seguinte função bash (a ser adicionada ao .bashrc ou originada dele) permite que os indicadores sejam adicionados e removidos do arquivo de indicadores. É relativamente novo e não é garantido que esteja livre de erros.
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
}
Uma maneira seria criar um alias para cd que substitui ~c
para o caminho desejado. Ou apenas use zsh;)
Para alterar diretórios, você pode usar wcd: Whereever Change Directory
Com isso, será como wcd plugin_root
.
Eu tenho a função abaixo, que criará um apelido em tempo real,
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
}
Quando quero marcar um diretório, basta digitar s dirName
. Isso cria um alias como alias dirName="cd /my/current/directory/;pwd"
. para que eu possa voltar a esse diretório digitando dirName
. Eu tenho uma versão que salva em bash_aliases também. Isso funciona em qualquer Shell.