atalhos de diretório bash

26

Quando eu digito cd ~foo , eu gostaria que o bash me levasse para algum diretório foo como um atalho para digitar o caminho completo do diretório foo . e gostaria de poder cp ~foo/bar.txt ~/bar.txt copiar um arquivo do diretório /foo/ para o diretório pessoal ... Então, basicamente, eu quero algo que funcione exatamente como ~/ , mas onde eu especifico o que o diretório deve ser. [Eu tenho certeza que deveria jfgi, mas eu não sei o que fg]

    
por Seamus 01.09.2010 / 18:10

7 respostas

35

A maneira que eu costumava fazer isso é criar um diretório que contenha links simbólicos para os diretórios que você quer que os atalhos façam e adicionar esse diretório ao seu CDPATH. O CDPATH controla onde cd irá procurar quando você alternar os diretórios, então se esse diretório de links simbólicos estiver no seu CDPATH você pode cd para qualquer um dos diretórios ligados diretamente:

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

A desvantagem é que não funcionará se houver um diretório em seu diretório atual chamado "b" - que tem precedência sobre o CDPATH

Eu normalmente não gosto de respostas que dizem "primeiro você precisa trocar shells", mas esse recurso exato existe em ZSH , se você estiver disposto a usar isso em vez disso; é chamado diretórios nomeados . Você exporta uma variável foo e, quando se refere a ~foo , ela é resolvida com 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"
    
por 01.09.2010 / 18:28
10

Você poderia escrever uma função de invólucro para cd e chamá-lo de "cd" (em última análise, a função chamará builtin cd - usando a palavra-chave builtin ). Você poderia 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 ele apareça como o caractere inicial em seus nomes de diretório, talvez ":". Você gostaria de torná-lo mais robusto, mas aqui está um resumo 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
    
por 01.09.2010 / 21:48
6

com bash:

~foo é reservado para o diretório inicial do usuário foo. Eu não recomendaria criar usuários apenas para essa conveniência.

Você pode tornar sua vida mais fácil (ou mais difícil) quando alterar diretórios definindo 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 esses diretórios que você deseja abreviar.

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR
    
por 01.09.2010 / 18:20
2

As variáveis de bash podem ser usadas para criar um sistema de bookmarking. As variáveis funcionarão com qualquer comando e o bash irá completar o nome da variável. Nas versões mais recentes do bash, se um / é anexado ao nome da variável, o caminho que a variável contém também pode ser tabulado.

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 originado de .bashrc. Como esse arquivo é um script bash, ele pode conter declarações que referenciam outras variáveis, como aur="${HOME}/AUR" , ou que são executadas somente em determinados hosts if [[ $HOSTNAME == foo ]]; then bar=baz; fi , o que é útil se você reutilizar arquivos de configuração em vários hosts e usuários. p>

A seguinte função bash (a ser adicionada a .bashrc ou originada dela) permite que os marcadores sejam adicionados e removidos do arquivo de marcadores. É relativamente novo e não é garantido que não contenha 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
}
    
por 02.07.2014 / 23:03
0

Uma maneira seria criar um alias para cd que substitua ~c ao caminho desejado. Ou apenas use zsh;)

    
por 22.09.2010 / 12:30
0

Para alterar os diretórios, você pode usar o wcd: Sempre que alterar o diretório

Com isso, será como wcd plugin_root .

    
por 22.09.2010 / 13:46
0

Eu tenho a função abaixo que criará alias imediatamente,

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" . então eu posso voltar a este diretório apenas digitando dirName . Eu tenho uma versão que salva em bash_aliases também. Isso funciona em qualquer shell.

    
por 11.11.2011 / 10:32

Tags