Как предотвратить выполнение команды с тактовыми отметками в сценариях Linux bash

Из man zip страница:

zip - r foo foo -x \ *. o

, который будет включать содержимое foo в foo.zip, исключая все файлы, заканчивающиеся на .o. Обратная косая черта позволяет избежать подстановки имени файла оболочки, так что сопоставление имен выполняется с помощью zip на всех уровнях каталогов .

Вы должны убедиться, что ваш глобус * расширяется не оболочкой, а самой утилитой zip , иначе это повлияет только на файлы непосредственно в каталоге / etc / alternatives и не будет нацеливаться на подкаталоги. Это можно сделать, добавив обратную косую черту перед * или процитировав его:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/\*

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

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip $(sudo find /etc | grep -v ^/etc/alternatives)
1
11.04.2019, 01:20
1 ответ

Примечание :этот ответ относится к первой версии вопроса.

Сначала определим iс помощью вкладки:

$ i=$'ls -l\tcd ~'

Теперь давайте попробуем ваши команды без, а затем с двойными -кавычками:

$ echo $i | cut -f2
ls -l cd ~
$ echo "$i" | cut -f2
cd ~

Если вы хотите, чтобы cutработало должным образом, вам нужно заключить $iв двойные -кавычки. Без двойных -кавычек оболочка выполняет, среди прочего, разбиение слов , в результате чего табуляция заменяется пробелом. Это препятствует тому, чтобы команда cutработала так, как вы ожидаете.

Выполнение назначения Command не меняет этого:

$ Command=$(echo $i | cut -f2); declare -p Command
declare -- Command="ls -l cd ~"
$ Command=$(echo "$i" | cut -f2); declare -p Command
declare -- Command="cd ~"

Общие комментарии

Вы не предоставили здесь более широкий контекст, но, как правило, пытаться помещать команды в переменные — плохая идея. См. "Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!" .

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

2
27.01.2020, 23:30

Теги

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