Псевдоним не работает так, как предполагалось в .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, так как мне предлагается ввести текст). Это псевдоним, точная копия между «":

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 в 19:10

2 ответа

Подсветка синтаксиса вопроса должна показать вам, где вы поступили не так: псевдоним начинается с двойной кавычки, а затем вы используете другую двойную кавычку, закрывая оригинал, поэтому позже подстановка команд (и «$ {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
ответ дан 17 July 2018 в 22:10

Подсветка синтаксиса вопроса должна показать вам, где вы поступили не так: псевдоним начинается с двойной кавычки, а затем вы используете другую двойную кавычку, закрывая оригинал, поэтому позже подстановка команд (и «$ {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
ответ дан 23 July 2018 в 22:49

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

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