Псевдоним для перехода в самую новую папку в папке

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 раза, прежде чем он переключится в новую папку.

14
задан 27 July 2020 в 15:30

4 ответа

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:

22
ответ дан 30 July 2020 в 22:02

Не используйте псевдонимы для чего-то более сложного, чем сокращение имени команды или передача параметров по умолчанию команде. Вместо этого используйте функцию. Вы избавите себя от многих головных болей.

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 оценивается при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.

    t работает, потому что подстановка команд в VAR = $ (…) и подстановка переменных в cd $ VAR оцениваются при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.

    t работает, потому что подстановка команд в VAR = $ (…) и подстановка переменных в cd $ VAR оцениваются при определении псевдонима. Если вместо этого вы используете одинарные кавычки, точная строка внутри кавычек оценивается при запуске псевдонима, который будет работать в этом случае. Однако я не рекомендую использовать псевдоним, даже если его можно заставить работать, потому что функции намного проще понять.

    1
    ответ дан 30 July 2020 в 22:02

    Проблема с использованием 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"'
    
    6
    ответ дан 30 July 2020 в 22:02

    Если вы собираетесь читать только одну строку, я предлагаю вам использовать встроенную функцию read

    res(){
        read -r < <( \
        ls -r --quoting-style=shell-escape /a/b/c*); eval cd "$REPLY"
    }
    

    . Вы можете поместить функцию в .bashrc или .bash_aliases.

    0
    ответ дан 18 December 2020 в 11:29

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

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