Исключение двойных кавычек для переменных в bash и qmake

Вы можете сделать это, добавив префикс к скрипту, который вы хотите вставить:

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 таким образом - другой вопрос ...

2
09.05.2017, 01:20
2 ответа

Я не знаком с синтаксисом 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, но имейте в виду, что это также рекурсивно превращается в символические ссылки на каталоги.

1
27.01.2020, 22:10

Если все, что вам нужно сделать, это найти каталоги, которые непосредственно содержат файл с расширением .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

Что дает вам именно то, что вам нужно; относительные пути без префикса ./.

1
27.01.2020, 22:10

Теги

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