Попытка сделать псевдонимы, которые открывают последний измененный файл

Одной из вещей, которую я часто делаю, является редактирование последних измененных файлов, поэтому вместо ввода «ls -lr», а затем «vim lastfile», я думал, что сделаю несколько ярлыков в файле ~ / .bash_profile:

alias via="vim `ls -rt | tail -1`" alias vib="vim `ls -rt | tail -2 | head -1`" alias vic="vim `ls -rt | tail -3 | head -1`" alias vid="vim `ls -rt | tail -4 | head -1`" alias vie="vim `ls -rt | tail -5 | head -1`" 

Проблема в том, что, как ни странно, эти команды не работают. Они открывают некоторый файл, который не является одним из последних, или даже файл был удален из текущего каталога (интересно, есть ли какая-то проблема обновления кеша файлов в каталоге. Это происходит как на моей локальной машине, так и на кластере I работа над).

Однако, если я vim `ls -rt | tail -1` vim `ls -rt | tail -1` напрямую, без использования псевдонима, он работает каждый раз.

  • Назначение IP-адреса переменной окружения
  • Как временно обходить псевдоним в tcsh?
  • Собирать коды выхода из параллельных фоновых процессов (подклассов)
  • Жареный зола PS1 не расширяется
  • Справка Сценарий оболочки для передачи переменных в rsync
  • Что означает «$ {x %% *}» в sh?
  • Как сохранить длинный список имен хостов для быстрого использования SSH?
  • error = $ (mkdir test 2> & 1) В чем смысл этого выражения?
  • 2 Solutions collect form web for “Попытка сделать псевдонимы, которые открывают последний измененный файл”

    Проблема в том, что вам нужно указывать обратные элементы в определении псевдонима. Двойные кавычки ( " ) не содержат подстановки команд. Вам понадобятся одинарные кавычки ( ' ).

     alias via='vim `ls -rt | tail -1`' 

    Хотя вы действительно хотите:

     alias via='vim -- "$(ls -t | head -n 1)"' 

    То есть:

    • используйте современную форму подстановки команд ( $(...) ), пока мы на ней.
    • цитируйте его, чтобы отключить оператор split + glob (иначе он не будет работать должным образом, если имя файла имеет символы IFS или подстановочные знаки (он все еще не работает, если у него есть символы новой строки)).
    • Используйте -- чтобы пометить конец опций для vim (в противном случае он не будет работать для имен файлов, начиная с - или + ).
    • Использовать ls -t | head ls -t | head вместо ls -rt | tail ls -rt | tail чтобы получить результат раньше.

    Не используй

     alias via="vim `ls -rt | tail -1`" 

    Если вы это сделаете, то подстановка команды происходит, когда вы определяете псевдоним, а не когда вы его запускаете. Попробуйте ввести alias via чтобы увидеть, что вывод не является фактически alias via='vim `ls -rt | tail -1`' alias via='vim `ls -rt | tail -1`' а скорее alias via='vim <prematurely expanded output>' .

    С zsh (также предварительно установленным на OS / X) и предполагая, что вы используете систему завершения ( compinit и co), Ctrl + X m становится дополнением, которое расширяется до самого нового файла.

    Так:

      vi Ctrl + X m 

    Сделал бы вы отредактируете новый файл (вы также получите возможность увидеть, до чего он нажимает Return ).

      vi Alt + 2 Ctrl + X m 

    Для второго – новейшего файла.

      vi * .c Ctrl + X m 

    для нового c файла.

      vi * (.) Ctrl + X m 

    для нового обычного файла (не каталога, ни fifo / device …) и так далее.

    Вы также определяете свой псевдоним как:

     alias via='vim -- *(.om[1])' 

    Чтобы отредактировать новый (не скрытый) обычный файл в текущем каталоге без проблем, связанных с разбором вывода ls .

    С bash и предполагая, что GNU реализует find и sort , вы можете добиться того же с помощью функции, например:

     via() { local file IFS=/ read -rd '' file file < <( find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' | sort -rzn ) && vim -- "$file" } 

    Что вы можете параметризовать, чтобы иметь возможность указать второй, третий … новейший файл с (если GNU Bash 4.4 или новее и GNU coreutils 8.25 или новее):

     via() { local files readarray -d '' -t files < <( find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' | sort -rzn | cut -zd / -f 2 ) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}" } 

    Использовать как:

     via 3 

    например, для редактирования третьего новейшего файла.

    Linux и Unix - лучшая ОС в мире.