Intereting Posts
Несжатые .lzo файлы параллельно, а затем удалить исходные .lzo-файлы wpa_supplicant wifi-direct соединение между Linux и Android Проблема с получением VLC для записи с веб-камеры через командную строку Создайте «реальный» второй сетевой интерфейс «на лету» для тестирования DHCP Печать на X-терминал быстрее, чем печать на tty? Лучшая последняя версия или пакет для rkhunter и chkrootkit? Debian jessie больше не может приостановить Как установить чип по умолчанию в alsamixer? Или отключить автоматическое отключение звука в PulseAudio? Может ли rpm вызывать внешний скрипт, хранящийся где-то в пакете во время установки? Как получить установленное приложение для обнаружения rofi? Проблема с Radeon HD 6570 Скажите Bacula использовать только пустые ленты Как установить среду рабочего стола на Ubuntu после базовой установки сервера Что такое ICMP-ответ для all-zero host-bit IPv4-адрес? передача переменных env в команды в bash

почему «ls * bash *» не отображает файл .bashrc

Я подключился к домашнему каталогу и набрал

ls *bash* 

ожидая, что он покажет список файлов, содержащий «bash». Однако это не так.

Хотя, набрав

 ls .bash* 

работает.

Согласно документации, * обозначает любого персонажа, не так ли? Но, похоже, это не представляет . в этом случае. Что не так?

dotglob оболочки dotglob управляет этим:

 $ shopt -s dotglob $ ls *bash* .bash_history .bash_logout .bashrc 

Он не включен по умолчанию, вероятно, как показатель удобства использования / безопасности, поскольку большинству конечных пользователей не нужно беспокоиться о dotfiles и может очень легко удалить важные файлы домашнего каталога (такие как .config , .ssh ) случайно.

В большинстве оболочек символ «*» не будет соответствовать начальному «.». характер по историческим причинам (например, файлы, начинающиеся с «.» считаются скрытыми, а «.» и «..» относятся к каталогам)

Следовательно, ls не отображает .bashrc, но ls -a покажет все файлы. Аналогично, ls * будет распространяться на все файлы, кроме тех, которые начинаются с символа «.». персонаж.

Измените это поведение на shopt -s dotglob который сообщает bash, что «*» также должен совпадать с начальным «.». персонаж. После этого ls * покажет .bashrc.

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

Если вы напишете ls -l .* Вы будете соответствовать .bashrc , но вы также будете соответствовать специальным скрытым файлам . и .. которые являются каталогами, поэтому для отображения скрытых файлов вам нужно что-то в этом направлении:

  • ls -ld .*
  • ls -l .[^.]*
  • ls -A | grep bash

ls -A *bash* не покажет вам .bashrc потому что файл globbing выполняется до того, как опция -A вступит в силу.

Если вы хотите изменить способ работы файлов с скрытыми файлами, вы можете выполнить shopt -s dotglob , либо просто в оболочке для тестирования, либо добавить свой .bash_profile или .bashrc, чтобы он всегда был эффективным.