Ww У нас есть результаты роботов, созданные в отдельных папках в формате" result-yyyy-mm-dd-hh-mm-ss "и В настоящее время у меня это есть в моем bash_aliases
alias res="VAR=$(ls --directory /path/to/results/res* | tail -n 1); cd $"
Однажды он работает нормально ... затем мне нужно перезагрузить мой bashrc, чтобы он снова заработал. Попытался перегрузить перезагрузку в новый псевдоним, но все равно пришлось использовать это 2-3 раза, прежде чем он переключится в новую папку.
Double quotes allow the alias contents to be evaluated at definition time - use single quotes to postpone evaluation until runtime:
alias res='var=$(ls --directory /path/to/results/res* | tail -n 1); cd $var'
See also:
Не используйте псевдонимы для чего-то более сложного, чем сокращение имени команды или передача параметров по умолчанию команде. Вместо этого используйте функцию. Вы избавите себя от многих головных болей.
res () {
local latest
latest="$(ls --directory /path/to/results/res* | tail -n 1)" && cd "$latest"
}
local
сохраняет переменную локальной для функции, поэтому она не будет мешать переменной с тем же именем, определенным вне функции. &&
гарантирует, что cd
не будет выполнен, если ls
завершится неудачно из-за отсутствия подходящих файлов. декларация
и присвоение самой последней
находятся в отдельных инструкциях. В противном случае состояние local latest = "$ (…)"
будет равно 0, даже если команда внутри $ (…)
не выполнена. Ваша попытка не сработала, потому что подстановка команд в VAR = $ (…)
и подстановка переменных в cd $ VAR
оцениваются, когда определен псевдоним. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.
local latest = "$ (…)"
будет равно 0, даже если команда внутри $ (…)
не выполнена.
Ваша попытка не сработала, потому что подстановка команд в VAR = $ (…)
и подстановка переменных в cd $ VAR
оцениваются, когда определен псевдоним. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.
local latest = "$ (…)"
будет равно 0, даже если команда внутри $ (…)
не выполнена.
Ваша попытка не сработала, потому что подстановка команд в VAR = $ (…)
и подстановка переменных в cd $ VAR
оцениваются, когда определен псевдоним. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.
Ваша попытка не сработала, потому что подстановка команд в VAR = $ (…)
и подстановка переменных в cd $ VAR
оценивается при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.
Ваша попытка не сработала, потому что подстановка команд в VAR = $ (…)
и подстановка переменных в cd $ VAR
оценивается при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.
VAR = $ (…)
и подстановка переменных в cd $ VAR
оцениваются при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять. t работает, потому что подстановка команд в VAR = $ (…)
и подстановка переменных в cd $ VAR
оцениваются при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять. Проблема с использованием ls
заключается в том, что что-то должно анализировать выходные данные ls
, что, по общему признанию, является плохим. Вы получаете странные крайние регистры с именами файлов, которые содержат символы новой строки и другие странности, которые могут опрокидываться хвостом
.
Вы можете делать то, что вы хотите, с простым расширением глобуса:
for i in /path/to/res-*/; do :; done; cd "$i"
По сути, это просто отметка в списке что-то делать и ничего не делать, кроме присвоения его переменной i
. Когда цикл завершен, он просто использует последнее значение для i
. Это не очень умно, но должно обеспечивать приемлемую производительность до нескольких миллионов узлов.
И, как другие предложили, вы можете использовать псевдоним, который в вашем ~ / .bashrc
alias res='for i in /path/to/res-*/; do :; done; cd "$i"'
Если вы собираетесь читать только одну строку, я предлагаю вам использовать встроенную функцию read
res(){
read -r < <( \
ls -r --quoting-style=shell-escape /a/b/c*); eval cd "$REPLY"
}
. Вы можете поместить функцию в .bashrc или .bash_aliases.