Заключение в кавычки / выходящий / проблема расширения в “команде в переменной”

[114973] Для загрузки исходных текстов ядра Linux на дистрибутиве на базе Red Hat необходимо использовать утилиту [115450]yum[115451]. Это эквивалентно [115452]apt-get[115453]. Эта утилита должна быть либо запущена с использованием [115454]sudo[115455], либо стать пользователем root на коробке.

Источник будет установлен здесь:

Где [115456]uname -r[115457] - это версия ядра+архитектуры, которую вы используете:

Это источник для ядра версии 3.13.9. Точечный релиз (проект Fedora добавляет патчи к своему ядру), который представлен [115458]-100[115459]. Архитектура [115460]x86_64[115461], т.е. 64-битная.[114980].

1
21.01.2015, 00:00
2 ответа

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

Настольное приложение может представлять собой плазменное (KDE), nautilus (gnome) и другие. Для каждого конкретного случая это зависит от того, можно ли отключить автоматический перезапуск рабочего стола в случае его закрытия или сбоя. Если это не помешает, вы можете просто убить процесс. Вы также можете сообщить DE, что делать через dbus (в зависимости от конкретного случая).

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

Я понимаю, что это не полный ответ, просто приблизительный план (слишком длинный, чтобы поставить комментарий). Не стесняйтесь комментировать, как действовать в каждом конкретном случае.

-121--120454-

Избегая обратной косой черты в \n\r , похоже, сделал трюк

cmd="freebcp ${db_name}.dbo.${table_name} in ${p_file} -S ${server_name} -U ${username} -P ${password} -t "," -r "\\r\\n" -c"
-121--154368-

Краткий ответ: см. BashFAQ # 50: Я пытаюсь ввести команду в переменную, но сложные случаи всегда терпят неудачу! .

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

Решение в вашем ответе (удвоение символов побега) будет работать (в большинстве случаев), но не по той причине, по которой вы думаете, что оно работает, и это заставляет меня нервничать. Команда

cmd="freebcp ... -t "," -r "\\r\\n" -c"

Выполняется синтаксический анализ строки с двойными кавычками freebcp... -t , за которой следует строка без кавычек , , за которой следует строка с двойными кавычками -r , за которой следует строка без кавычек\\r\\n (то, что она не процитирована, является причиной того, что необходимо удвоить переходы), за которой следует строка с двойными кавычками ' Двойные кавычки, которые вы хотели быть частью последовательности, не рассматриваются как часть последовательности, они рассматриваются как разделители, которые меняют способ синтаксического анализа различных частей последовательности (и на самом деле имеют в значительной степени обратное предполагаемому эффекту). Причина, по которой это работает, заключается в том, что двойные кавычки на самом деле не имели большого эффекта в исходной команде, так что обращение их эффекта не сделало многого. На самом деле, было бы лучше удалить их (только внутренние),потому что это было бы менее вводящим в заблуждение относительно того, что происходит на самом деле. Это сработало бы, но это было бы хрупко. Единственная причина, по которой это сработало, это то, что вам не нужны двойные цитаты для начала, и если бы у вас была ситуация (например, пароль или имя файла с космосом в нем), где вы действительно нуждались в кавычках, у вас были бы проблемы.

Есть несколько лучших вариантов:

  • Не сохраняйте команду в переменной вообще, просто выполните ее напрямую. Хранить команды сложно (как вы находите), и если вам не нужно, просто не надо.

  • Используйте функцию. Если вы выполняете одну и ту же команду снова и снова, определите ее как функцию и используйте следующую:

     loaddb () {
    freebcp "$ {db _ name} .dbo. $ {table _ name}" в "$ {p _ file}" -S "$ {server _ name}" -U "$ {username}" -P "$ {password}" -t\" ,\" -r\"\r\n\" -c "
    }
    loaddb
    

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

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

     cmdarray = (freebcp "$ {db _ name} .dbo. $ {table _ name}" в "$ {p _
    «$ {cmdarray [@]}»
    

    Снова обратите внимание на плодовитое использование двойных цитат; здесь они используются, чтобы убедиться, что элементы массива определены правильно, а не как часть значений, хранящихся в массиве. Кроме того, следует отметить, что массивы доступны не во всех оболочках; убедитесь, что вы используете bash или zsh или что-то подобное.

Пара заключительных примечаний: когда вы используете что-то вроде:

`somecommand`

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

Наконец, предоставление пароля в качестве аргумента команды небезопасно - аргументы команды, опубликованные в таблице процесса (например, команда ps может их видеть), и публикация паролей в общедоступных расположениях - это действительно плохая идея. freebcp , похоже, не имеет альтернативного способа для этого, но я нашел патч , который позволит ему прочитать пароль от stdin ( echo «$ password» | freebcp -P -... -- обратите внимание, что echo является компоновкой оболочки, поэтому ее аргументы не отображаются в таблице процесса). Я не утверждаю о правильности, безопасности и т.д. пластыря (тем более, что он довольно старый), но я бы проверил его на вашем месте.

6
27.01.2020, 23:13

Спасение обратного слеша в \n\r похоже, сделали трюк

cmd="freebcp ${db_name}.dbo.${table_name} in ${p_file} -S ${server_name} -U ${username} -P ${password} -t "," -r "\\r\\n" -c"
1
27.01.2020, 23:13

Теги

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