Использование printf, когда строка имеет обратную косую черту

Не используйте which (если вы не используете варианты csh или tcsh ), он не работает. Вместо этого используйте команду -v node .

POSIX предлагает команду dirname , чтобы получить часть каталога в имени пути:

cd "$(dirname -- "$(command -v node)")"

или использовать переменную для хранения имени пути, не позволяя вам вызывать имя каталога :

nodepath=$(command -v node)
cd "${nodepath%/*}"

1
10.03.2018, 22:31
1 ответ

Это не удается, так как printfинтерпретирует некоторые буквы с обратной косой чертой в своем первом аргументе как специальные.

Обычно при использовании printfвы указываете

  1. Статическая строка форматирования, возможно содержащая заполнители для данных, которые должны быть взяты из других аргументов, и
  2. Другие переменные данные, которые будут использоваться в заполнителях в строке статического форматирования.

Это означает, что первый аргумент printfможет всегда быть строкой в ​​одинарных кавычках.

В оболочке вы можете использовать просто %sв качестве заполнителя практически для всего в строке форматирования, если только вам не нужны такие вещи, как заполнение слева/справа (, например. %20sдля использования 20 символов для строки с выравниванием по правому краю -или %-20sдля строки с выравниванием по левому краю -), определенное количество знаков после запятой в числах с плавающей запятой(%.3fдля трех знаков после запятой ), или нулем -заполнение целых чисел(%08dдля восьми цифр, нулем -заполнение )и т. д.

Например, чтобы напечатать строку, используйте %sв строке форматирования:

v='\u\$'
printf 'PS1 will be set to "%s"\n' "$v"   # or just:  printf '%s\n' "$v"
PS1="$v"

или

PS1='\u\$'
printf 'PS1 was set to "%s"\n' "$PS1"   # or just:  printf '%s\n' "$PS1"

Будет выведено

PS1 will be set to "\u\$"

и

PS1 was set to "\u\$"

См. printf(1)и/или printf(3)в вашей системе(man 1 printfиman 3 printf).


Также обратите внимание, что PS1не нужно экспортировать.

8
27.01.2020, 23:12

Теги

Похожие вопросы