web-development-kb-pt.site

atalhos do diretório bash

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]

29
Seamus

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"
39
Michael Mrozek

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
10

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
7
user601

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

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

0
krissi

Para alterar diretórios, você pode usar wcd: Whereever Change Directory

Com isso, será como wcd plugin_root.

0
alex

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.

0
balki