Intereting Posts
RAR – папка автоматически каждые x минут Перезагружает ли SO_ATTACH_FILTER буфер приема сокета? Форматирование блочного устройства 1 ГБ (петля) с помощью btrfs. Будет ли это представлять проблему баланса в будущем? Упаковка Debian с зависимостью (с нуля) Я не вижу .bashrc в моем домашнем каталоге, но хочу сделать постоянное изменение на моем пути Использование wget over ssh с завершенным сеансом Как запустить скрипт в нескольких экземплярах? (Сервер Ubuntu) Canon MX 920 печатает цвет, даже если я задаю оттенки серого Почему thunderbird покидает рабочее пространство, когда я нажимаю на уведомление? «Удаленные прерывания вызова функции» (CAL in / proc прерывает). Что это? Более высокий уровень судо, убивающего PID Создайте правило iptables, если это правило еще не существует Запустите команду и запросите эту команду, пока она еще работает Не удается удалить файл из samba share + Solaris + ZFS Отладка проблемы с приостановкой печати с PM_TRACE

Показать содержимое символической ссылки

В zsh я делаю символическую ссылку

 $ ln -s ~/Documents symboliclink 

а затем я хочу знать, что внутри этой символической ссылки.

 $ ls -l symboliclink > lrwxrwxrwx 1 user user 21 Oct 10 15:56 symboliclink -> /home/user/Documents 

Это показывает только символическую ссылку, а не то, что внутри нее. Если я использую только ls , он перечисляет содержимое, но если я использовал флаг -l , это не так. Это работает в bash как для ls и ls -l . Как я могу получить это поведение в zsh ?

Вероятной причиной кажущейся разницы в выходе ls -l между zsh и bash является использование Tab AUTO_REMOVE_SLASH с AUTO_REMOVE_SLASH включенным в zsh (что является значением по умолчанию).

AUTO_REMOVE_SLASH <D>

Когда последний символ, полученный в результате завершения, является косой чертой, а следующий введенный символ является разделителем слов, косой чертой или символом, который завершает команду (например, точкой с запятой или амперсандом), удаляет косую черту.

При вводе ls -l symb Tab оба zsh и bash завершат это с помощью ls -l symboliclink/ (обратите внимание на / в конце). Разница в том, что zsh (с включенным AUTO_REMOVE_SLASH ) удалит косую черту, если вы просто нажмете Enter (т.е. завершите команду) там.

Таким образом, вы эффективно запускаете ls -l symboliclink/ в bash , который сообщает ls -l чтобы посмотреть ссылку. Но в zsh вы запустите ls -l symboliclink , который сообщает ls -l что вы хотите видеть информацию о ссылке, а не целевой каталог.

ls без опции -l всегда будет показывать содержимое целевого каталога, независимо от того, существует ли / в конце или нет.


Чтобы заставить zsh не удалять косую черту в конце, достаточно просто ввести ее явно после завершения TAB . Обычно это не приведет к заметному изменению завершенного текста, но если вы наберете пробел или подтвердите команду, / останется. «Обычно», потому что можно установить подсветку для автоматически добавленных символов суффикса, например, пурпурный и полужирный:

 zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold" 

( Примечание: это может не сработать при использовании внешнего плагина подгонки синтаксиса ZSH )

Другое решение (очевидно) отключить AUTO_REMOVE_SLASH . Это можно сделать с помощью

 setopt noautoremoveslash 

Просто добавьте '/' в конец.

 ls -l symboliclink/ 

Это опция ls -H :

 ls -lH symboliclink 

От man 1p ls :

-ЧАС

Если в командной строке указывается символическая ссылка, ссылающаяся на файл каталога типов, ls должен оценивать информацию о файле и тип файла как файл файла, на который ссылается ссылка, а не сама ссылка; однако ls должно написать имя самой ссылки, а не файл, на который ссылается ссылка.

Также обратите внимание на вариант -L

-L

Оценить информацию о файле и тип файла для всех символических ссылок (независимо от того, указан ли он в командной строке или встречается в иерархии файлов), таких как файл, на который ссылается ссылка, а не сама ссылка; однако ls должно написать имя самой ссылки, а не файл, на который ссылается ссылка. Когда -L используется с -l, напишите содержимое символических ссылок в длинном формате (см. Раздел STDOUT).

Поведение программы ls не зависит от оболочки, которая ее вызывает. Если вы наблюдаете различное поведение с ls в bash и zsh, это потому, что у вас есть псевдоним (или функция), называемый ls в одной из оболочек, но не в другой. Поведение, которое вы наблюдаете в zsh, соответствует тому, что делает ls , поэтому вы должны называть его дополнительными параметрами в bash.

У вас может быть aliased ls до ls -H или ls -L , чтобы сделать его разыменованием символических ссылок. Это плохая идея, потому что вы не можете получить информацию о самих символических связях, кроме обхода псевдонима ( \ls ).

Когда файл является символической ссылкой на каталог, вы можете действовать в каталоге, а не в файле, добавив косую черту в конце: ls -l symboliclink/ эквивалентен ls -l symboliclink/. , См. Когда символическая ссылка рассматривается как вещь, на которую она ссылается, и как символическая ссылка?