Если я заменить строки `ГРМ` с `языка` будет что сделать это надо регистрировать в 11.10? Почему Фрай? С сладкий картофель и их содержание сахара, выпечки позволяет сахар хрустящий и коричневый? Огромное спасибо. Поскольку я новичок в этом очень помогли. иметь хороший день. @1_CR конечно.. но что я должен сделать то же самое ? Интересно. Поэтому команды `ls` пытается разрешить UID и GID, чтобы имена в этой среде, тоже. @psusi я склонен согласиться..просто очень странное совпадение, я думаю...мысли о том, почему останова системы происходит только при перезагрузке, но не кнопка выключения -> власть? почему бы не создать небольшой скрипт, который создает файл при первом запуске и работает только если файл не существует? так что хрон может вызвать сценарий 2x, но скрипт уведомления и логика делается только 1х. @Хеннинг будет зависеть от того, как был задан вопрос. Если вопрос был "по шкале 1-100, как вы сами на эту технологию", то сюжет может быть более актуальна, чем вы думаете.

Это обсуждалось в ряде вопросов на Unix.ЮВ, я постараюсь собрать все вопросы, которые я могу придумать. Ссылки в конце.


Почему это не удается

Причина, по которой вы сталкиваетесь с этими проблемами является разбиение и тот факт, что котировки расширились от переменных не вступили в силу.

В случаях, представленных в вопрос:

$ АВС='ЛС-л "в/tmp/тест/мой Дир"'

Здесь, $АВС разбивается, и лс получает два аргумента "в/tmp/тест/мой и Дира" (с кавычки присутствуют):

$ $букварь
ЛС: невозможно получить доступ к '"в/tmp/тест/мой': Нет такого файла или каталога
ЛС: невозможно получить доступ к 'реж"': нет такого файла или каталога

Здесь, расширение цитируют, значит он хранится как единое слово. Оболочка пытается найти программу под названием ЛС-л "в/tmp/тест/мой Дир", пробелы и кавычки включены.

$ "$АВС"
Баш: ЛС-л "в/tmp/тест/мой Дир": нет такого файла или каталога

И вот, только первое слово или $АВС взята в качестве аргумента , так что Баш просто работает ЛС в текущем каталоге. Другими словами аргументы на баш, и используются для заполнения $0, $1и т. д.

$ Баш-с $букварь
мой Дир'

С Баш-с "$азбука", и функция eval "$Аbc", есть дополнительные раковины для обработки шаг, который делает котировки работать, но также вызывает все оболочки расширения должны быть обработаны снова, так что есть риск случайного запуска команды расширения предоставленные пользователем данные, если вы очень осторожны, о цитировании.


Лучшие способы сделать это

Две более эффективные способы сохранения команды являются: а) использовать функцию вместо, б) использовать переменную массива.

Используя функцию:

Просто объявить функцию с командой внутри, и запустить функцию, как если бы это были команды. Расширением команды в функции обрабатываются только тогда, когда команда выполняется, а не когда он определен, и вам не надо цитировать отдельные команды.

# определить
myls() {
 ЛС-л "/ТМП/тест/мой Дир"
}

# запустить его
myls

Используя массив:

Массивы позволяют создавать мульти-словом переменных, где отдельные слова содержать пробелы. Здесь отдельные слова сохраняются как отдельные элементы массива, и "${массив[@]}" расширение расширяется каждый элемент как отдельный оболочки слов:

# определить массив
mycmd=(ЛС-л "в/tmp/тест/мой Дир")

# выполните команду
"${mycmd[@]}"

Синтаксис немного ужасно, но массивы также позволяют строить команду по частям линии. Например:

mycmd=(общ.) начальная команда # 
если [ "$want_detail" = 1 ]; тогда
 mycmd+=(-л) # дополнительные флаги
интернет
mycmd+=("$targetdir") # имя

"${mycmd[@]}"

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

варианты=(-х -в)
файлы=(файл1 "имя файла с пробелами")
цель=/somedir

трансмутировать "${параметры[@]}" "${файлы[@]}" "$таргет"

Недостаток решеток в том, что они не стандартной функцией, так просто в POSIX оболочек (как и тире, по умолчанию /Бен/Ш в Дебиан/Убунту) не поддерживают их. Баш, КШ и zsh, тем не менее.

Используя "$@"

В оболочках без поддержки именованных массивов, можно еще использовать "$@" держать аргументов команды.

Ниже приведены портативный скрипт биты, что делает эквивалент кода в предыдущем разделе в /бен/ш, используя $@ список позиционных параметров. Параметр "$@" это сделано с набора, а двойные кавычки вокруг "$@" важны (эти элементы из списка, который будет индивидуально заключать в кавычки).

Во-первых, просто хранить команды с аргументами в "$@":

комплект -- ЛС-л "в/tmp/тест/мой Дир"
"$@"

Условно устанавливать части параметры командной строки для команды:

комплект -- общ.
если [ "$want_detail" = 1 ]; тогда
 комплект -- "$@" -л
интернет
набор -- "$@" "$targetdir"

"$@"

ТОЛЬКО используя "$@" для опции и операнды:

комплект -- -х -в
комплект -- "$@" файл1 "имя файла с пробелами"
комплект -- "$@" /somedir

трансмутировать "$@"

Будьте осторожны с ивал!

Как ивала вводит дополнительный уровень котировки и расширение переработка, вы должны быть осторожны с пользовательского ввода. Например, это работает, пока пользователь не тип в какой-то одной цитаты:

читал -Р именем
КМД="Общ -л '$имя'"
функция eval "$ЦМД";

Но если они вносят вклад '$(команде uname)'.тхт, ваш сценарий с удовольствием выполняет команды замена.

Версию с массивами не застрахован, что со слов хранятся отдельно в течение всего времени, нет цитаты или другие обработки для содержанием именем.

читал -Р именем
КМД=(Общ -ЛД -- "именем")
"${команду cmd[@]}"

Ссылки