O alias não funciona como planejado em .bashrc, enquanto o comando não

0

Se eu executar o seguinte através do shell, ele funcionará como pretendido, ou seja, ele localizará o último arquivo modificado e emitirá o mesmo usando cat :

aux="$(find  /home/w/Dropbox/notes/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" ")"; cat "${aux}"

Considerando que, se eu tentar atribuí-lo a um alias em .bashrc, ele não funciona (estou incerto sobre o que ele faz, parece que o comando cat está sendo usado, pois sou solicitado a inserir texto). Este é o alias, um copypaste exato entre "":

 alias readlast="aux="$(find  /home/w/Dropbox/notes/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" ")"; cat "${aux}""

Observe que ele funciona quando atribuído diretamente pelo shell, mas eu quero que seja um alias permanente.

Muito obrigado pelo seu tempo.

    
por D1X 26.01.2018 / 16:10

1 resposta

2

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@ %p
alias readlast="aux=<name-of-file>; cat "
' | sort -zrn | sed -z 's/[0-9.]* //; q')" cat "${aux}" }

O -printf em -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.

    
por muru 27.01.2018 / 05:23