Итак, похоже, что источником проблемы было то, что у меня были подключенные библиотеки Qt, такие как libQt5Core.so.5
в /usr/local/lib
. Когда я удалил их, все снова заработало.
Я читал, что менеджер пакетов не помещает туда никаких библиотек, так что, вероятно, это я совершил глупую ошибку.
Вы можете использовать здесь документ:
while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
printf '%s\n' "this is a single line: ${SINGLELINE}"
printf '%s\n' "SOMEVAR is now: ${SOMEVAR}"
done << EOF
$MULTILINE
EOF
printf '%s\n' "Final SOMEVAL is still $SOMEVAR"
В зависимости от реализации sh
, здесь -документы реализованы либо как удаленный временный файл, в котором оболочка заранее сохранила расширение переменной, за которым следует перевод строки, либо как канал, в который оболочка передает расширение переменная, за которой следует новая строка. Но в любом случае, за исключением оригинальной оболочки Bourne (, которая больше не используется в наши дни и не является POSIX-совместимой оболочкой ), перенаправляемая команда не выполняется в подоболочке (, как POSIX. требует ).
или вы можете использовать split+glob:
IFS='
' # split on newline only
set -o noglob
for SINGLELINE in $MULTILINE
do
SOMEVAR="updated value"
printf '%s\n' "this is a single line: ${SINGLELINE}"
printf '%s\n' "SOMEVAR is now: ${SOMEVAR}"
done
printf '%s\n' "Final SOMEVAL is still $SOMEVAR"
Но будьте осторожны, он пропускает пустые строки.
У меня работает:
$ cat bin/test
#! /bin/sh
SOMEFILE=$1
MULTILINE="`cat ${SOMEFILE}`"
SOMEVAR="blah"
echo "${MULTILINE}" | while IFS= read -r SINGLELINE
do
echo "this is a single line: ${SINGLELINE}"
echo "but accessing this var fails: ${SOMEVAR}"
done
и
$ bin/test bin/test
this is a single line: #! /bin/sh
but accessing this var fails: blah
this is a single line: SOMEFILE=$1
but accessing this var fails: blah
this is a single line: MULTILINE="`cat ${SOMEFILE}`"
but accessing this var fails: blah
this is a single line: SOMEVAR="blah"
but accessing this var fails: blah
this is a single line:
but accessing this var fails: blah
this is a single line: echo "${MULTILINE}" | while IFS= read -r SINGLELINE
but accessing this var fails: blah
this is a single line: do
but accessing this var fails: blah
this is a single line: echo "this is a single line: ${SINGLELINE}"
but accessing this var fails: blah
this is a single line: echo "but accessing this var fails: ${SOMEVAR}"
but accessing this var fails: blah
this is a single line: done
but accessing this var fails: blah
Вы бы читали прямо из файла без конвейера. Это позволяет избежать запуска цикла while
в подоболочке, что позволяет вам видеть измененное значение $SOMEVALUE
после цикла.
SOMEVAR="original value"
while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
printf 'this is a single line: %s\n' "$SINGLELINE"
printf 'SOMEVAR is now: %s\n' "$SOMEVAR"
done <"$SOMEFILE"
printf 'Final SOMEVAR is: %s\n' "$SOMEVAR"
Если вы настаиваете на своей $MULTILINE
переменной, запишите ее в файл и прочитайте оттуда:
tmpfile=$(mktemp)
printf '%s\n' "$MULTILINE" >"$tmpfile"
while...; do
...
done <"$tmpfile"
rm "$tmpfile"
Также связанные:
Ответ на связанный выше вопрос также предполагает написание вашей программы таким образом, чтобы все использования $SOMEVAR
происходили внутри подоболочки в конце конвейера:
MULTILINE=$(cat "$SOMEFILE")
SOMEVAR="original value"
printf '%s\n' "$MULTILINE" | {
while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
printf 'this is a single line: %s\n' "$SINGLELINE"
printf 'SOMEVAR is now: %s\n' "$SOMEVAR"
done
printf 'Final SOMEVAR is: %s\n' "$SOMEVAR"
}
Также, возможно, связано:
Другие вопросы, которые могут представлять интерес: