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

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

  • Что означает синтаксис этой команды оболочки с помощью extglob?
  • Как сделать переменную из подоболочки доступной в родительской оболочке
  • Скрипт для проверки статуса промежуточного сервера
  • Попытка перенаправить <enter> и второй ответ на скрипт linux shell
  • Как узнать, написан ли сценарий оболочки в bash или sh
  • конвертация изображений в сегментах
  • Установить уровень сжатия LZMA через tar
  • Почему результаты сравнения строк всегда ложны
  • 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 

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

    Interesting Posts

    Различное использование папок в каталоге / (root)

    Arch Linux – Можно ли поручить pacman установить определенные пакеты в определенный каталог?

    Полный список параметров tput

    Нечетное поведение GUI программного обеспечения в Ubuntu на основе eOS (источники, выбранные в фоновом режиме)

    недавно установленный debian gnome 3 висит при выключении

    Область переменной в нескольких трубах

    Как установка CentOS работает изнутри?

    ksh "<< EOF", чтобы изменить пользователя

    Почему NetBSD является самой стабильной ОС здесь?

    Почему атрибуты терминала отличаются друг от друга?

    Автоматическое обнаружение уже открытого браузера вместо открытия по умолчанию

    Где приложение должно сохранять рабочие файлы?

    Дисковое пространство в окнах, не отображающее фактический размер изображения qcow2

    Почему gcc не может найти libevent при построении tmux из исходного кода?

    найти использование с -L

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