O alias não suporta operandos como $ @ ou $ 1, $ 2, etc.
Seu comando
alias mvaf="mv $@ && cd $_"
é igual a mv ' ' && cd $_
porque $@
não é reconhecido pelo alias da maneira esperada.
Isso pode ser provado facilmente assim:
$ alias mvaf='echo "Part 1:" $@ && echo "Part 2: " $_'
$ mvaf file66 /tmp/
Part 1:
Part 2: Part 1: file66 /tmp/
#Part 2 includes the previous executed command (echo "Part 1:" $@) & the text sent after alias name
$ alias mvaf='echo "Part 1:" $@;echo "Part 2: "'
$ mvaf file66 /tmp/
Part 1:
Part 2: file66 /tmp/
Por outro lado, isso funciona, mas não por causa de $ @
$ alias mvaf='echo "mv $@"'
$ mvaf file66 /tmp/
mv file66 /tmp/
$ alias mvaf='echo "mv"'
$ mvaf file66 /tmp/
mv file66 /tmp/
Como ideia geral, o alias é um tipo de substituição simples.
Alias aa='command1;command2'
, quando chamado como aa sometext
, igual a command1;command2 sometext
Para fazer isso funcionar, você precisa fazer isso com uma função. Bash desencoraja o uso de alias e incentiva o uso de funções para esses trabalhos. Você pode colocar esta função no seu arquivo de perfil bash, e esta função pode ser chamada pelo nome diretamente do seu terminal, como você faria com qualquer alias:
mvcd() { mv "$1" "$2" && cd "$2"; }
Encadear os comandos mv
e cd
com &&
é importante aqui, pois &&
garante que o segundo comando cd
será executado somente se o comando anterior mv
tiver sido bem-sucedido.
Alternativamente, como já foi recomendado no link da resposta aceita na sua pergunta , você poderia fazer algo como
mvf() { mv "$@" && goto "$_"; }
goto() { [ -d "$1" ] && cd "$1" || cd "$(dirname "$1")"; }
Tenha cuidado com a divisão de palavras bash. Para fazer com que tal função funcione corretamente, você precisa inserir aspas duplas ao chamar a função se o arquivo que você vai mover ou o diretório para o qual o arquivo será enviado incluir espaço em seu nome.
$ mvcd() { echo "1=$1";echo "2=$2";echo "3=$3";echo "4=$4"; }
$ mvcd spaced file1 /spaced directory/
1=spaced
2=file1
3=/spaced
4=directory/
$ mvcd "spaced file1" "/spaced directory/"
1=spaced file1
2=/spaced directory/
3=
4=