Заключение в кавычки в $ (управляют заменой) в Bash

Если Вам на самом деле настроили RAID через аппаратные средства (т.е. операционная система видит, что меньше физических дисков, чем Вы на самом деле имеет), нет никаких аппаратных средств к методу преобразования программного обеспечения. Необходимо создать резервную копию данных к альтернативному местоположению, преобразовать RAID вручную и восстановление.

131
22.10.2015, 07:28
3 ответа

В порядке от худшего к лучшему:

DIRNAME="$(dirname $FILE)"

не будет делать то, что вы хотите[11820], если [11821]$FILE[11822] содержит пробелы или глобусные символы [11823]\[?*[11824].

DIRNAME=`dirname "$FILE"`[11826] технически верно, но [11827]backticks не рекомендуется для расширения команд[11828] из-за дополнительной сложности при их вложении.

DIRNAME=$(dirname "$FILE")[11830] верно, но [11831] только потому, что это присваивание[11832]. Если вы используете подстановку команд в любом другом контексте, например, [11833]export DIRNAME=$(имя "$FILE")[11834] или [11835]du $(имя "$FILE")[11836], то отсутствие кавычек вызовет проблемы, если результат расширения будет содержать пробелы или глобусные символы.

DIRNAME="$(имя "$FILE")"[11838] - это рекомендуемый способ. Вы можете заменить [11839]DIRNAME=[11840] на команду и пробел, не меняя ничего, и [11841]dirname[11842] получит правильную строку.

Для еще большего улучшения:

DIRNAME="$(dirname -- "$FILE")"[11844] работает, если [11845]$FILE[11846] начинается с тире.

DIRNAME="$(dirname -- "$FILE"; printf x)" && DIRNAME="${DIRNAME%?x}"[11848] работает, даже если [11849]$FILE[11850] заканчивается новой строкой, так как [11851]$()[11852] отсекает новые строки в конце вывода и [11853]dirname[11854] выводит новую строку после результата. Sheesh [11855]dirname[11856], почему вы должны быть другими?

sudo apt-get install git build-essential
sudo sudo apt-get build-dep emacs

git clone git://github.com/emacsmirror/emacs
cd emacs
./autogen.sh &> log.autogen
./configure &> log.configure
make bootstrap &> log.bootstrap
sudo make install &> log.install

Вы можете вставлять расширения команд сколько угодно. С помощью $() вы всегда создаете новый контекст кавычек, так что вы можете делать такие вещи:

Вы делаете не, чтобы попробовать это с обратными стиками.

.
193
27.01.2020, 19:29

Эффект цитирования переменных всегда можно показать с помощью printf

  • . Разделение слова на
  • var1
  • :var1 цитируется, поэтому никакого разделения слова:

    Разделение слова на var1 внутри $(), эквивалентно echo "hello" "world":

    [Automount]
    Where=/mnt/backup1
    [Install]
    WantedBy=remote-fs.target
    

    Нет разделения слов на var1, нет проблемы не цитировать $():

    Разделение слов на var1 снова:

    net stop "audiosrv"
    

    Цитирование обоих, самый простой способ быть уверенным.

    net start "audiosrv"
    

    Проблема глобуса

    Не цитирование переменной также может привести к глобусному расширению ее содержимого:

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

    $ stty intr ^C^J
    

  • 19
    27.01.2020, 19:29

    Дополнение к принятому ответу:

    , в то время как я обычно согласен с ответом @ l0b0's revact здесь, я подозреваю, что размещение голых блин в списке «худший к лучшему», по крайней мере, частично результатом Предположение, которое $ (...) доступно везде. Я понимаю, что вопрос указывает Bash, но есть много раз, когда Bash оказывается в виду / bin / sh , что может не всегда быть полным бурном снова оболочкой.

    В частности, равнинная раковина Bourne не узнает, что делать с $ (...) , поэтому скрипты, которые утверждают, что будут совместимы с ним (например, через #! / BIN / SH SHIBANG LINE), скорее всего, плохо себя ведет, если бы они на самом деле управляют «настоящим» / bin / sh - это особый интерес, когда, скажем, создавая скрипты init или упаковку до - и посткрипты, а могут приземлиться в удивительном месте во время установки базовой системы.

    Если кто-то из этого звучит как то, что вы планируете делать с этой переменной, вложение, вероятно, меньше интересного, чем на фактически проведении сценария, предсказуемого. Когда это просто достаточно простой случай, и переносимость - это беспокойство, даже если я ожидаю, что скрипт обычно работает на системах, где / bin / sh - это bash, я часто склонен использовать образец для По этой причине с несколькими заданиями вместо вложенности.

    Сказав все это, повсеместность оболочек, которые реализуют $ (...) (bash, dash, et al.), Оставляет нас в хорошем месте, чтобы придерживаться красивее, проще Гнездо, и недавно предпочтительный синтаксис POSIX в большинстве случаев по всем причинам @ l0b0 упоминается.

    В сторону: это иногда показало время в Stackoverflow -

    10
    27.01.2020, 19:29

    Теги

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