Вопрос или проблема
Я пытаюсь добавить это в мой ~/.bashrc и протестировать некоторые команды, которые уже имеют псевдонимы.
command -pv <команда>
но кажется, что опция -p
, которая должна заставлять выполнять поиск по пути, игнорируется.
Не уверен, является ли это ошибкой для отчета, поэтому я решил уточнить, если я что-то упускаю.
Тесты
Версия Bash: 5.2
Уровень исправлений: 37
Статус релиза: релиз
Я удостоверился, что это встроенная команда оболочки
┌──(jore㉿localhost)-[~]
└─$ type command
command - это встроенная команда оболочки
┌──(jore㉿localhost)-[~]
└─$ command --help
command: command [-pVv] команда [арг ...]
Выполнить простую команду или отобразить информацию о командах.
Выполняет COMMAND с ARGS, подавляя поиск функций оболочки, или отображает
информацию о заданных COMMANDs. Может использоваться для вызова команд
на диске, когда существует функция с таким же именем.
Опции:
-p использовать значение по умолчанию для PATH, которое гарантированно найдет все
стандартные утилиты
-v вывести описание COMMAND, похожее на встроенную команду `type`
-V вывести более подробное описание каждой COMMAND
Статус завершения:
Возвращает статус завершения COMMAND, или неудачу, если COMMAND не найден.
Работает с псевдонимами
┌──(2:Неправильное использование команды)──(jore㉿localhost)-[~]
└─$ command -v pacman
alias pacman='pacman --color auto'
┌──(jore㉿localhost)-[~]
└─$ command -v grep
alias grep='grep --color=auto'
Но полностью игнорирует ‘-p’, независимо от того, как он указан.
┌──(jore㉿localhost)-[~]
└─$ command -pv grep
alias grep='grep --color=auto'
┌──(jore㉿localhost)-[~]
└─$ command -p -v grep
alias grep='grep --color=auto'
Здесь я пытаюсь вставить неизвестный параметр, чтобы убедиться, что он распознает ‘-p’, но просто
игнорирует его.
┌──(jore㉿localhost)-[~]
└─$ command -p -v -x grep
bash: command: -x: недопустимый параметр
command: использование: command [-pVv] команда [арг ...]
Дополнительные заметки
В zsh все, кажется, работает хорошо, опция -p
обрабатывается так, как должна. (Я не включаю тесты zsh, потому что это касается bash)
Ответ или решение
Вопрос о поведении встроенной команды command
в Bash, особенно касаемо опции -p
, является важным аспектом работы с командной оболочкой, особенно если вы настраиваете свой ~/.bashrc
для тестирования команд, которые могут иметь свои алиасы.
Понимание проблемы
Команда command
в Bash используется для выполнения обычной команды или для отображения информации о командах. Она позволяет игнорировать переопределения команд, такие как функции и алиасы. Ключ -p
предназначен для использования стандартного пути (PATH), который гарантирует нахождение всех стандартных утилит. Однако, как вы заметили, опция -p
не влияет на работу с алиасами.
Поведение команды command
Важный момент заключается в том, что опция -p
реально не влияет на вывод команды, когда вы используете её для команд, которые уже имеют алиасы. Когда вы выполняете command -p -v grep
, Bash по-прежнему возвращает alias grep='grep --color=auto'
, вместо того чтобы демонстрировать путь к утилите grep
, так как команда уже переопределена алиасом.
Функциональность команды command
в данном случае оставляет желать лучшего, поскольку ожидалось, что опция -p
будет «игнорировать» алиасы и предоставлять путь к стандартному исполняемому файлу, а не к алиасу.
Почему это происходит?
Причиной такого поведения является то, что команда command
в Bash не позволяет опции -p
принудительно игнорировать алиасы. Если команда имеет алиас, Bash всегда будет возвращать алиас, даже если вы укажете -p
. Это связано с тем, как Bash обрабатывает алиасы на уровне оболочки. Bash сначала проверяет наличие алиасов, а затем только рассматривает команды и их параметры.
Проверка поведения в других оболочках
Вы также отметили, что в Zsh -p
работает так, как и ожидалось, предоставляя путь к утилите. Это подчеркивает различия в реализации различных оболочек. Zsh действительно считает опцию -p
важной и не возвращает алиас в случае ее присутствия.
Заключение
Таким образом, поведение команды command
в Bash с опцией -p
не является ошибкой, а скорее признает специфику реализации, которая отличает Bash от других оболочек, таких как Zsh. Это может быть неудобным, но, по сути, является ожидаемым исходом на основе принципа работы командной оболочки Bash.
Рекомендации
Для обхода этой проблемы вы можете использовать команды, такие как type
, чтобы выяснять информацию о командах и алиасах, либо использовать command -p
без учета алиасов:
command -v <command_name>
или
command -p <command_name>
на случай, если вы уверены, что вам нужно получить именно путь, а не алиас.
Если вы хотите внести исправления в конфигурации, возможно, стоит рассмотреть использование пользовательских функций оболочки, которые могут сочетать оба подхода.