Одиночные кавычки и переменные внутри оболочки Борна
У меня есть команда, которую я пытаюсь выполнить в оболочке Bourne для Solaris 9.
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}
Моя проблема, переменная ${PARSEDATA}
не будет работать должным образом, я попытался использовать двойные кавычки, то проблема $0
имя скрипта, выполняющего этот код, а не файл, расположенный с помощью find
команда.
Любые предложения, чтобы решить эту, вероятно, легкую проблему, очень полезны.
Заранее спасибо.
Обновить: $0
это имя скрипта, расположенного с использованием find
команда, переменная для ${PARSEDATA}
это фильтр, расположенный где-то в системе, который изменяет вывод каждого найденного скрипта. Однако проблема в том, что я не могу получить $0
а также ${PARSEDATA}
правильно расширяться, либо $0
расширяется нормально, используя одинарные кавычки или двойные кавычки ${PARSEDATA}
расширяется нормально, но потом $0
становится именем оригинального скрипта, который запускает этот find
-command.
3 ответа
Сохраняйте одинарные кавычки, проблема, скорее всего, в том, что вы не экспортировали переменную PARSEDATA.
export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}
Если вы хотите, чтобы оболочка $0 не была расширена оболочкой (используя одинарные кавычки), а ${PARSEDATA} была расширена, то почему бы просто не использовать разные кавычки для каждого:
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}
Пока вы сохраняете объединенные части в кавычках, оболочка будет просто расширять ${PARSEDATA} и передавать всю команду как один токен для поиска.
Я не уверен в том, что вы пытаетесь сделать? Но если вы хотите найти сценарии с именем check_*, а затем запустить его и передать через программу ${PARSE_DATA}, я думаю, что файл, найденный командой find, не является $0
но {}
пример
find /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \; (Википедия)
Поэтому я думаю, что вы можете использовать ваши двойные кавычки:
find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}
Я попытался успешно:
PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;
> Bleh Blah