O realce da sintaxe da pergunta deve mostrar onde você errou: o alias começa com aspas duplas e, em seguida, você usa outra aspa dupla, fechando o original, assim a substituição do comando (e "$ {aux}" posteriormente) é avaliado quando o alias é criado, não quando é executado. Então, se você executar alias readlast
, pareceria:
alias readlast="aux=<name-of-file>; cat "
O "${aux}"
é obviamente vazio, porque não foi definido no momento em que o alias foi criado. É por isso que cat
está esperando pela entrada - sem um nome de arquivo, ele apenas reflete a entrada padrão.
Você pode consertá-lo usando aspas simples para toda a definição de alias (e removendo as aspas simples de dentro do alias):
alias readlast='aux="$(find /home/w/Dropbox/notes/ -type f -printf "%T@ %p\n" | sort -n | tail -1 | cut -f2- -d" ")"; cat "${aux}"'
Ou use uma função:
readlast()
{
aux="$(find /home/w/Dropbox/notes/ -type f -printf '%T@ %p\n' |
sort -n |
tail -1 |
cut -f2- -d" ")"
cat "${aux}"
}
Como nota lateral, você pode simplificar o canal usando sed
:
readlast()
{
aux="$(find /home/w/Dropbox/notes/ -type f -printf '%T@ %palias readlast="aux=<name-of-file>; cat "
' |
sort -zrn |
sed -z 's/[0-9.]* //; q')"
cat "${aux}"
}
O
em -printf
-z
e sort
para sed
/ -r
é delimitado por entrada com o caractere ASCII NUL em vez de novas linhas. É o único caractere não válido em um caminho, então é o mais seguro para lidar com nomes de arquivos e caminhos. Com sort
, sed
irá reverter a ordem para você, e o comando %code% então remove o registro de data e hora após a primeira linha de entrada.