Псевдоним, не работающий, как предназначено в .bashrc, в то время как команда делает

Если я выполняю выполнение оболочки, оно работает, как предназначено, т.е. оно находит последний измененный файл и производит его использование cat:

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

Принимая во внимание, что, если я пытаюсь присвоить его псевдониму в .bashrc, это не работает (я не уверен в том, что это делает, это кажется как будто cat команда используется, поскольку мне предлагают ввести текст). Это - псевдоним, точный copypaste между "":

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

Обратите внимание, что это действительно работает при прямом присвоении через оболочку, но я хочу, чтобы это было постоянным псевдонимом.

Большое спасибо в течение Вашего времени.

0
задан 26 January 2018 в 08:10

1 ответ

Подсветка синтаксиса вопроса должна показать Вам, где Вы пошли не так, как надо: псевдоним запускается с двойной кавычки, и затем Вы используете другую двойную кавычку, закрывая оригинал, таким образом, замена команды (и "$ {aux}" позже) оценена, когда псевдоним создается, не, когда это выполняется. Таким образом, если Вы работаете alias readlast, это было бы похоже:

alias readlast="aux=<name-of-file>; cat "

"${aux}" конечно, пусто, потому что это не было установлено в то время, когда псевдоним был создан. Вот почему cat ожидает входа - без имени файла, он просто реагирует на стандартный вход.

Вы могли зафиксировать его при помощи одинарных кавычек для всего определения псевдонима (и удаление одинарных кавычек из псевдонима):

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

Или использование функция:

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

Как примечание стороны, можно упростить использование канала sed:

readlast()
{
    aux="$(find /home/w/Dropbox/notes/ -type f -printf '%T@ %p\0' |
      sort -zrn |
      sed -z 's/[0-9.]* //; q')"
    cat "${aux}"
}

\0 в -printf и -z для sort/sed вводится разграниченный с символом ASCII NUL вместо новых строк. Это - единственный символ, не допустимый в пути, таким образом, это является самым безопасным для контакта с именами файлов и путями. С -r, sort инвертирует порядок на Вас, и sed команда затем снимает изоляцию с метки времени и выходов после первой строки входа.

2
ответ дан 31 October 2019 в 03:21

Другие вопросы по тегам:

Похожие вопросы: