#shell #zsh #ubuntu-18.04 #ros #oh-my-zsh
#оболочка #zsh #ubuntu-18.04 #ros #о-мой-zsh
Вопрос:
Я использую среду оболочки ZSH (с плагином «oh-my-zsh») в своем Ubuntu 18.04, и я заметил проблему с ней. Я думаю, что моя оболочка ZSH иногда не идентифицирует *
«все файлы».
Например, если бы я хотел установить все пакеты ROS с префиксом control
, я бы ввел команду: sudo apt-get install ros-melodic-control*
и это должно сработать и установить все пакеты ROS Melodic control
, начиная с основного репозитория ROS. Эта вещь работала, когда я использовал BASH ранее. Но теперь, когда я делаю то же самое в ZSH, это выдает следующую ошибку : zsh: no matches found: ros-melodic-control*
Было бы здорово, если бы кто-нибудь помог мне определить точную проблему.
TIA
Ответ №1:
В этом разница между zsh и bash. zsh никогда не будет запускать команду, содержащую шаблон подстановочных знаков, который не соответствует существующим файлам. Bash будет выполняться как есть.
Также может произойти сбой по-разному. Если поиск вернет все, что соответствует шаблону, например, файл с именем ros-melodic-control.pdf
, zsh выполнит sudo apt-get install ros-melodic-control.pdf
. ПРИМЕЧАНИЕ: подстановочные знаки всегда проверяются оболочкой.
Считайте, что это параноидальная оболочка для некорневых пользователей, которые в основном взаимодействуют только с файловой системой. Чтобы действительно делать то, что вы хотите, вы должны использовать одинарные кавычки.
sudo apt-get install 'ros-melodic-control*'
Пакеты, указанные в качестве аргумента apt-get, не являются файлами. это имена в базе данных, которые также содержат их местоположение (локальный кэш в / var, диск, удаленный сервер или источник NFS). Поэтому вы должны убедиться, что они передаются как строка, если вы используете подстановочные знаки. Просто с помощью bash sh ksh вы можете обойтись без кавычек, если у вас нет подходящих файлов.
Добавление кавычек приведет к передаче вложенного текста «как есть» в аргументы выполняемой программы в виде строки. Поэтому apt-get получит строку ros-melodic-control*
и будет искать пакеты, которые ей соответствуют. Без кавычек shell попытается развернуть подстановочные знаки.
Комментарии:
1. Спасибо!!! Добавление одинарных кавычек сработало отлично! Однако я не понял причины. Можете ли вы объяснить это более четко?
2. пакеты @adbidwai, указанные в качестве аргумента apt-get, не являются файлами. это имена в базе данных, которые также содержат их местоположение (локальный кэш в / var, диск, удаленный сервер или источник NFS). Поэтому вы должны убедиться, что они передаются как строка, если вы используете подстановочные знаки. Просто с помощью bash sh ksh вы можете обойтись без кавычек, если у вас нет подходящих файлов.