Eu gostaria de construir uma função curta para fazer o seguinte. Digamos que eu movo o arquivo 'file.tex' para o meu diretório de documentos:
mv file.tex ~/Documents
Em seguida, gostaria de acessar cd
esse diretório:
cd ~/Documents
Eu gostaria de generalizar isso para qualquer diretório, para que eu possa fazer isso:
mv file.tex ~/Documents
follow
e faça com que o follow
comando leia o destino do comando anterior e execute de acordo. Para um diretório simples, isso não economiza muito tempo, mas ao trabalhar com diretórios aninhados, seria tremendo poder usar apenas
mv file.tex ~/Documents/folder1/subfolder1
follow
Eu pensei que seria relativamente simples e que eu poderia fazer algo assim:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
mas isso não parece funcionar. Se eu ecoar $place
, obtenho a string desejada (estou testando ~/Documents
), mas o último comando retorna
No such file or directory
O diretório certamente existe. Estou perdida. Você poderia me ajudar?
fonte
file.tex
em manter o local original, os links simbólicos são uma alternativa muito boa, pois você só precisa vincular uma vez e, sempre, apontará para a versão mais recente.cd
alt +.
para substituir o último token do comando anterior. Repita para voltar ainda mais na história dos tokens finais. (Eu digo token não arg, porquefoo &
agarra&
como o token final.) Você pode usar um argumento numérico (com escape-3 alt +. Por exemplo).Respostas:
Em vez de definir uma função, você pode usar a variável
$_
, que é expandida para o último argumento do comando anterior porbash
. Então use:após o
mv
comando.Você também pode usar a expansão do histórico:
Se você deve usar uma função:
NB: Esta resposta está direcionada ao formato exato dos argumentos da linha de comando que você usou, pois estamos lidando com parâmetros posicionais. Para outros formatos
mv -t foo bar.txt
, por exemplo , você precisa incorporar verificações específicas antecipadamente, um wrapper seria apropriado então.fonte
cd !$
ou outrocd $(dirname !$)
. Não sabia sobre a$_
variável!mv -t ~/Documents file.tex
vez demv file.tex ~/Documents
? Bottom line, eu não estou certo de que este é solúvel no caso geral ... uma função de invólucro em torno ou que reimplementamv
poderia ser melhor ...!$
é equivalente!:$
e mais rápido para digitar.Com as combinações de teclas padrão do bash, a combinação Alt.copia o último argumento da linha de comando anterior para a atual. Então, digitando
renderia
e seria ainda menos digitado que a palavra
follow
.Para maior comodidade, a repetição da Alt.combinação percorrerá os últimos argumentos de todas as linhas de comando anteriores.
Adendo: O nome do comando bash correspondente a essa combinação de teclas é
yank-last-arg
ouinsert-last-argument
. Ele pode ser encontrado na página de manual do bash, em "Comandos para manipulação do histórico" ou no manual de referência do Bash, mais exaustivo .)fonte
<esc>
, em seguida,.
para obter o mesmo resultado que<alt>+.
, este útil quando você tem capslock remapped para escapar :)Você está quase certamente enfrentando o problema de que a expansão til ocorre antes da expansão dos parâmetros, o que pode ser explicado por um exemplo sucinto:
Isso pode ser resolvido com
eval
. De qualquer forma, você precisaráeval
, porque você está puxando comandos do histórico e eles podem conter expansões arbitrárias, como:(Há problemas, como o fato de que a reexpansão desses valores talvez não corresponda mais à expansão original que ocorreu. Suponha que
compute_folder_name
seja uma função que incrementa alguma variável global.)fonte
eval
. (Ever.) Mas boa localização sobre os problemas da sequência de expansão. Se você mencionar a maior conveniência da expansão do histórico para usareval
aqui, esta será a melhor resposta na minha opinião; nenhum dos outros realmente explica por que a solução do Pôster original falhou.