Вы можете сделать это, добавив префикс к скрипту, который вы хотите вставить:
echo '
, а затем суффикс строки, например:
'|sudo tee ses.sh >/dev/null && sudo chmod +x ses.sh && sudo ./ses.sh
, а затем вы можете скопировать и вставить все это за один раз в командной строке. Например:
echo '#!/bin/bash
echo "Do some stuff - line 1"
echo "Do some stuff - line 2"
sudo echo -e "Do some stuff - line 3\nand line 4"
[[ 1 == 1 ]] && echo "We are all done here, bye!"
'|sudo tee ses.sh >/dev/null && sudo chmod +x ses.sh && sudo ./ses.sh
Это будет выдано, если скрипт, который вы вставляете, к сожалению, содержит одинарные кавычки.
Другой способ сделать это, фактически не сохраняющий файл, - это:
/bin/bash -c '[script here]'
т.е. префикс / bin / bash -c '
и суффикс одиночный '
Действительно ли целесообразно копировать и вставлять сценарии sudo таким образом - другой вопрос ...
Я не знаком с синтаксисом qmake, но из вашего примера он использует кавычки и переменные совершенно иначе, чем оболочки. Таким образом, вы не можете просто использовать один и тот же код.
http://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters охватывает то, что вам нужно знать, поэтому здесь я просто резюмирую то, что имеет отношение к вашему вопросу.
Короче говоря, вы не можете просто вставить команду оболочки в строку. Такие оболочки, как bash, не анализируют строки рекурсивно.Они анализируют исходный код и строят команды как списки строк: простая команда состоит из имени команды (путь к исполняемому файлу, имя функции и т. д.) и ее аргументов.
Когда вы используете такое присваивание, как AWK="awk '{\$1=substr(\$1,3);printf}'"
, это устанавливает для переменной AWK
значение нить; когда вы используете переменную как $AWK
вне двойных кавычек, это превращает значение переменной в список строк, анализируя его по пробелу, но не анализируя его как код оболочки, поэтому символы, такие как '
оказываются буквально в споре. Это редко бывает желательным, поэтому общий совет по использованию переменных в оболочке состоит в том, чтобы заключать двойные кавычки вокруг расширений переменных, если только вы не знаете, что вам нужно их оставить, и не понимаете, что это влечет за собой. (Обратите внимание, что мой ответ здесь не рассказывает всей истории.)
В bash вы можете вставить простую команду в массив.
#!/bin/bash
FIND=(find -name '*.pro' -printf '%h\\n')
AWK=(awk '{$1=substr($1,3);print}')
SUBDIRS=$("${FIND[@]}" | "${AWK[@]}")
Но обычно лучший способ сохранить команду — определить функцию. Это не ограничивается простой командой: таким образом вы можете иметь перенаправления, назначения переменных, условные операторы и т. д.
#!/bin/bash
find_pro_files () {
find -name '*.pro' -printf '%h\\n'
}
truncate_names () {
awk '{$1=substr($1,3);print}'
}
SUBDIRS=$(find_pro_files | truncate_names)
Я не уверен, что вы пытаетесь сделать с этим скриптом (особенно учитывая, что вы меняете найти
и awk
код между фрагментами кода), но, вероятно, есть лучший способ сделать это. Вы можете перебирать файлы *.pro
в подкаталогах текущего каталога с помощью
for pro in */*.pro; do
subdir="${pro%/*}"
basename="${pro##*/}"
…
done
. Если вы хотите рекурсивно перемещаться по подкаталогам, в bash вы можете использовать **/*.pro
вместо */*.pro
, но имейте в виду, что это также рекурсивно превращается в символические ссылки на каталоги.
Если все, что вам нужно сделать, это найти каталоги, которые непосредственно содержат файл с расширением .pro
, вы можете использовать xargs и, при желании, uniq, если хотите перечислите каталог только один раз, даже если он содержит несколько файлов pro:
find -type f -name "*.pro" | xargs -I{} dirname {} | uniq
Если вам нужны абсолютные пути, а не относительные:
find -type f -name "*.pro" | xargs -I{} dirname {} | xargs readlink -f | uniq
Как вы просили, решение с использованием awk:
find -type f -name "*.pro" | awk -F/ 'BEGIN { OFS="/" } { $1=""; $NF=""; print $0 }' | cut -c 2- | uniq
Что дает вам именно то, что вам нужно; относительные пути без префикса ./
.