Одиночные кавычки и переменные внутри оболочки Борна
У меня есть команда, которую я пытаюсь выполнить в оболочке 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