В:
cat test.txt | while read i; do echo $i; done
Вам удалось втиснуть довольно много плохих приемов написания сценариев оболочки:
читать
без -r
и IFS =
echo
для произвольных данных Хотя я, вероятно, сначала должен был упомянуть Почему использование цикла оболочки для обработки текста считается плохой практикой? .
Попробуйте, например, ввести такой ввод:
-n
/*/*/*/../../../*/*/*
foo\
bar
Если вам действительно нужно использовать цикл оболочки, это, вероятно, должно быть что-то вроде:
{
while IFS= read <&3 -r i; do
printf '%s\n' "$i" || exit
done
[ -z "$i" ] || printf %s "$i" || exit
} 3< test.txt
В
for i in $(cat test.txt); do echo $i; done
Это заменяет плохую практику другим. Здесь у вас есть веская причина оставить $ (cat test.txt)
без кавычек: вам нужна разделенная часть оператора split + glob, но вы забыли указать, что вы хотите разделить и чтобы отключить глобальную часть.
IFS='
' # split on newline only. The default value of $IFS
# contains space, tab and newline which explains why you see
# one word per line
set -o noglob # disable glob
for i in $(cat test.txt); do
printf '%s\n' "$i" || exit
done
Обратите внимание, что по-прежнему будут пропускаться пустые строки, и при этом выполняется чтение и сохранение содержимого файла в памяти (несколько раз) перед запуском цикла.
Мне удалось решить проблему. Я сделал это, отредактировав / etc / default / grub и изменив GRUB_CMDLINE_LINUX с
GRUB_CMDLINE_LINUX=" apparmor=1 security=apparmor"
на
GRUB_CMDLINE_LINUX=""
. Затем после запуска sudo update grub
и sudo reboot
проблема была исправлена . Однако это остановило работу apparmor, так как выдает ошибку:
apparmor.common.AppArmorException: 'Предупреждение: не удалось найти подходящую файловую систему в / proc / mounts, она смонтирована? \ NИспользуйте --subdomainfs для переопределения. \ N '
Однако мне удалось решить эту проблему, снова используя команды из руководства по debian.
sudo perl -pi -e 's,GRUB_CMDLINE_LINUX="(.*)"$,GRUB_CMDLINE_LINUX="$1 apparmor=1 security=apparmor",' /etc/default/grub
sudo update-grub
sudo reboot
После перезагрузки я попытался запустить firefox и не получил никаких ошибок, теперь все работает нормально. Однако, попробовав его на своем компьютере, я снова столкнулся с проблемой segfault, и это исправление не сработало. но после сравнения профилей apparmor в /etc/apparmor.d
я обнаружил, что правила профилей были другими.
Правила для segfaulting pc:
# Last Modified: Tue Aug 2 11:32:25 2016
#include <tunables/global>
/usr/lib/firefox/firefox {
#include <abstractions/base>
/usr/bin/firefox r,
}
Правила для рабочего компьютера:
# Last Modified: Tue Aug 2 11:32:25 2016
#include <tunables/global>
/usr/bin/firefox {
#include <abstractions/base>
#include <abstractions/bash>
/bin/dash ix,
/usr/bin/firefox r,
}
Я добавил #include
и / bin / dash ix,
в конфигурацию файл, затем изменил путь на / usr / bin / firefox
, и теперь проблема устранена после перезагрузки.