1

Когда я набираю

echo $HOME/Downloads | xargs cd

Это правильно меняет каталог на $ HOME/Downloads. Возможно, это потому, что echo оценивает $HOME перед отправкой в xargs .

Однако, если я наберу

echo '$HOME/Downloads' | xargs cd

$HOME/Downloads передается как xargs и не может сменить каталог. Выдает ошибку:

/usr/bin/cd: строка 4: cd: $ HOME/ Загрузки: нет такого файла или каталога

Поэтому мой вопрос: может ли xargs оценить $HOME , если может, то как.

2 ответа2

2

Переменные Bash могут быть оценены только оболочкой Bash.

Когда вы echo '$HOME/dir' и передаете результаты в другую команду, вы говорите bash не оценивать переменную и рассматривать параметр как строку.

xargs (и большинство других команд) не имеют понятия переменных bash - для их оценки необходимо вызвать оболочку bash. Например:

echo '$HOME/dir' | xargs bash -c cd 

Это вызвало бы оболочку bash, которая оценила бы переменную и cd в правильный директор. Однако после завершения оболочка завершит работу и вернет управление исходной оболочке (которая все еще будет в начальном каталоге).

Так что это работает, но, вероятно, не так, как вы этого хотите.

1

Пол объяснил правильно. Мой следующий ответ был написан до того, как Анураг Пешне любезно объяснил мне, что он имел в виду, см. Комментарии ниже. Я оставляю свой ответ таким, какой он есть, даже если он не имеет отношения к делу, потому что мне кажется трусливым скрывать мои ошибки.


Выражение, которое не работает так, как хотелось бы оригинальному OP, содержит:

    echo '$HOME/Downloads'

то есть переменная оболочки внутри одинарных кавычек, ''. Это стандартный язык оболочки bash для не вычисления выражения внутри одинарных кавычек. По факту,

    $ echo '$HOME/Downloads'
      $HOME/Downloads
    $ echo "$HOME/Downloads"
      /home/myname/Downloads

Обратите внимание на разницу между использованием одинарных кавычек '' и двойных кавычек "", которые вместо этого означают: заменять переменные.

На самом деле, руководство Bash говорит об этой разнице:

3.1.2.2 Одиночные кавычки

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

3.1.2.3 Двойные кавычки

Заключение символов в двойные кавычки ('' ') сохраняет буквальное значение всех символов в кавычках, за исключением' $ ',' `',' \'и, когда расширение истории включено,'! '. Символы '$' и '`' сохраняют свое специальное значение в двойных кавычках (см. Расширения оболочки). Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует один из следующих символов: '$', '`', '"', '\' или перевод строки. В двойных кавычках удаляются обратные слэши, за которыми следует один из этих символов. Обратная косая черта предшествующих символов без специального значения остается неизменной. Двойная кавычка может быть заключена в двойные кавычки, если им предшествует обратная косая черта. Если включено, расширение истории будет выполняться, если не указано «!» в двойных кавычках экранируется с помощью обратной косой черты. Обратная косая черта, предшествующая '!' не удаляется.

Специальные параметры '*' и '@' имеют особое значение в двойных кавычках (см. Расширение параметров оболочки).

Короче говоря, команды, отображаемые OP, работают точно так, как указано в руководстве по Bash, и весь этот бизнес полностью не связан с поведением xargs.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .