Делает ~, всегда равняются $HOME

По-видимому, это была ошибка со встроенным микропрограммным обеспечением UEFI, как описано в информации о версии для обновления встроенного микропрограммного обеспечения intels 0053. Однако НЕ устанавливайте его. Это облицует Вашу материнскую плату кирпичом! Хорошо сделанный Intel. Еще одна причина не иметь UEFI.

41
26.07.2014, 16:10
2 ответа

Что важно понимать, так это то, что расширение ~ - это особенность оболочки (некоторых оболочек), это не волшебный символ, который означает ваш домашний каталог, где бы оно ни использовалось.

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

Эта функция впервые появилась в C-оболочке в конце 1970-х годов (ее не было ни в оболочке Bourne, ни в ее предшественнице, оболочке Thompson), позже она была добавлена ​​в оболочку Korn (более новая оболочка, построенная на базе Bourne. оболочка в 80-е годы). В конечном итоге он был стандартизирован POSIX и теперь доступен в большинстве оболочек, включая не-POSIX, такие как fish .

Поскольку он так широко используется в оболочках, некоторые приложения, не являющиеся оболочкой, также распознают его как домашний каталог. Так обстоит дело со многими приложениями в их файлах конфигурации или в их собственной командной строке ( mutt , slrn , vim ...). В частности,

bash (который является оболочкой проекта GNU и широко используется во многих операционных системах на базе Linux) при вызове как sh в основном следует правилам POSIX ] о расширении ~ и в областях, не указанных в POSIX, ведет себя в основном как оболочка Korn (частью которой является клон).

В то время как $ var раскрывается в большинстве мест (за исключением одинарных кавычек), ~ раскрытие, будучи запоздалой мыслью, раскрывается только в нескольких конкретных условиях.

Он раскрывается как отдельный аргумент в контекстах списка, в контекстах, где ожидается строка.

Вот несколько примеров его раскрытия в bash :

  • cmd arg ~ other arg
  • var = ~
  • var = x: ~: x (обязательно POSIX, используется для таких переменных, как PATH , MANPATH ...)
  • для i в ~
  • [[~ = текст]]
  • [[text = ~]] (расширение ~ используется как образец в AT&T ksh , но не bash ] начиная с 4.0).
  • case ~ in ~) ...
  • $ {var # ~} (но не в некоторых других оболочках)
  • cmd foo = ~ (хотя и не при вызове как sh , и только когда то, что слева от = имеет форму bash имя переменной без кавычек)
  • cmd ~ / x (требуется POSIX очевидно)
  • cmd ~: x (но не x: ~: x или x- ~ -x )
  • a [~] = foo; echo "$ {a [~]} $ ((a [~])" (не в некоторых других оболочках)

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

  • echo "~" ' ~ '
  • echo ~ @ ~~ (также обратите внимание, что ~ u предназначен для расширения в домашний каталог пользователя u ).
  • echo @ ~
  • ((HOME == ~)) , $ ((var + ~))
  • с extglob : case $ var в @ (~ | other)) ... (хотя case $ var in ~ | other) в порядке).
  • ./ configure --prefix = ~ (поскольку - префикс не является допустимым именем переменной)
  • cmd "foo" = ~ bash , из-за кавычек).
  • при вызове как sh : export "foo" = ~ , env JAVA_HOME = ~ cmd ...

Что касается расширения до : ~ только расширяется до содержимого переменной HOME , или, если она не задана, до домашнего каталога текущего пользователя в базе данных учетной записи (как расширение, поскольку POSIX оставляет это поведение не определено).

Следует отметить, что в версиях ksh88 и bash до 4.0 расширение тильды подвергалось подстановке (генерации имени файла) в контекстах списка:

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

Это не должно быть проблемой в обычных случаях.

Обратите внимание, что из-за того, что он расширен, применяется то же предупреждение, что и другие формы расширений.

cd ~

Не работает, если $ HOME начинается с - или содержит .. компонентов. Таким образом, даже если это вряд ли когда-либо будет иметь значение, строго говоря, следует написать:

cd -P -- ~

Или даже:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

(чтобы покрыть значения $ HOME , например - ], +2 ...) или просто:

cd

(поскольку cd переносит вас в ваш домашний каталог без каких-либо аргументов)

В других оболочках есть более продвинутые ~ расширений. Например, в zsh мы имеем:

  • ~ 4 , ~ - , ~ -2 (с дополнением), используемые для расширения каталоги в стеке каталогов (места, в которые вы cd ранее).
  • каталоги с динамическими именами . Вы можете определить свой собственный механизм, чтобы решить, как ~ что-то расширяется.
47
27.01.2020, 19:35

В любой версии Bash на любой системе, да . ~ как термин сам по себе определяется для расширения до:

Значение $HOME

, поэтому оно всегда будет таким же, как и любое другое значение $HOME в текущей оболочке. Есть несколько других тильдовых расширений, таких как ~пользователь для домашнего каталога пользователя, но одно нецитируемое ~ само по себе всегда будет расширяться до "$HOME".

Обратите внимание, что поведение из ~ и $HOME может быть различным в некоторых случаях: в частности, если $HOME содержит пробелы (или другие IFS символы), то $HOME (без кавычек) будет расширяться до нескольких слов, в то время как ~ всегда одно слово. ~ расширяется эквивалентно "$HOME" (цитируется).

В отношении вашего конкретного вопроса:

[[ $HOME == ~ ]]

всегда верно, поскольку [[ подавляет разделение слов. [[ ~ ~ == $HOME ] может и не быть, если HOME имеет в своем составе символы , совпадающие с , но [[ ~ ~ == "$HOME" ]] (т.е. цитируемый "$HOME") всегда истинен. Использование его в одинарных скобках может быть синтаксической ошибкой для значений HOME, содержащих пробелы или специальные символы. Для любой разумной конфигурации домашнего каталога ~ и "$HOME" одинаковы и сравниваются как равные.


Стефан Шазелас отметил в комментариях случай, когда ~ и $HOME дают разные значения: если вы снимаете HOME, то при использовании ~ Бэш вызовет getpwuid для считывания значения из базы данных паролей. Этот случай исключается вашим условием отсутствия изменения конфигурации $HOME, но я упомяну об этом здесь для полноты.

.
25
27.01.2020, 19:35

Теги

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