Если я выполняю следующее через оболочку, он работает по назначению, т. е. находит последний измененный файл и выводит его с помощью 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}""
Обратите внимание, что он работает при назначении напрямую через оболочку, но я хочу, чтобы он был постоянным псевдонимом.
Большое спасибо за ваше время.
Подсветка синтаксиса вопроса должна показать вам, где вы поступили не так: псевдоним начинается с двойной кавычки, а затем вы используете другую двойную кавычку, закрывая оригинал, поэтому позже подстановка команд (и «$ {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 вычеркивает временную метку и завершает работу после первой строки ввода.
Подсветка синтаксиса вопроса должна показать вам, где вы поступили не так: псевдоним начинается с двойной кавычки, а затем вы используете другую двойную кавычку, закрывая оригинал, поэтому позже подстановка команд (и «$ {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 вычеркивает временную метку и завершает работу после первой строки ввода.