По какой-то причине /usr/bin/vi
работает неправильно на вашем компьютере, как вы можете сказать из сообщения об ошибке:
crontab: "/usr/bin/vi" exited with status 1
Что произошло, так это то, что при выходе vi
создается код ошибки. Когда crontab
увидит, что vi
вышел с кодом ошибки, он не будет доверять содержимому файла vi
, который редактировался, и просто не внесет никаких изменений в ваш crontab.
Вы можете попытаться выяснить, почему vi
не работает, или, если вы предпочитаете, вы можете использовать совершенно другой редактор. Например, если вы предпочитаете использовать vim
, вы можете ввести:
EDITOR=/usr/bin/vim crontab -e
Или вы можете сохранить «официальную» версию вашего crontab в вашем домашнем каталоге. Затем отредактируйте версию в домашнем каталоге и, наконец, установите ее с помощью:
crontab filename
-121--68319- Используйте -n
вместо -p
:
perl -ne 'print unless /[0-5],[0-5]?|[0-5].,[0-5]?/' file
-n
.
Я не уверен, какова ваша цель, так что вам, возможно, потребуется изменить регрессы, но общий подход должен сработать.
-121--229397-AppArmor работает с помощью исполняемого файла. Он не может выяснить, что Firefox загрузил другой профиль и поэтому он должен использовать другой профиль AppArmor.
AppArmor поддерживает правила изменения , которые позволяют приложению изменять профиль . Сценарий использования предназначен именно для того, чтобы позволить приложению переключиться на более ограничительный профиль после завершения инициализации и выяснить, к чему ему необходим доступ в данном конкретном экземпляре. Таким образом, если бы Firefox знал AppArmor, можно было бы дать ему изменить правило _ профиля
и применить переход, как только он выяснит, какой профиль будет запущен как. Насколько я знаю, этого не было сделано.
Без программирования можно создать несколько копий или жестких ссылок исполняемого файла firefox-bin
и определить различные профили для каждого из них (AppArmor основан на пути к исполняемому файлу, поэтому разные жесткие ссылки не должны использовать один и тот же профиль, в отличие от SELinux, который основан на inodes). Это требует root и не так удобно, поэтому функция профиля изменений была добавлена в AppArmor.
От man bash
:
set -u
«@»
и «*»
. При попытке расширения для неснятой переменной или параметра оболочка печатает сообщение об ошибке и, если не -i
nteractive, завершает работу с ненулевым состоянием. POSIX утверждает, что в случае ошибки расширения неинтерактивная оболочка должна выйти , когда расширение связано либо со специальной оболочкой (что является различением bash
в любом случае регулярно игнорируется, и поэтому, возможно, не имеет значения) или любой другой утилитой, кроме.
«$ {x! y}»
, потому что !
не является допустимым оператором) ; реализация может рассматривать их как синтаксические ошибки, если она способна обнаружить их во время токенизации, а не во время расширения. Также от man bash
:
ловушка... ERR
, пока
или до
ключевого слова... , если
утверждение... & &
или | |
, за исключением команды, следующей за последним & &
или | |
... !
. -e
. Обратите внимание на то, что ловушка ERR предназначена для оценки возврата некоторых других команд. Однако при возникновении ошибки расширения выполнение команды на возврат данных не выполняется. В примере echo
никогда не происходит - потому что пока оболочка вычисляет и расширяет свои аргументы, она встречает переменную -u
nset, которая была задана явным параметром оболочки, чтобы вызвать немедленный выход из текущей оболочки со сценарием.
Таким образом, выполняется ловушка EXIT , если таковая имеется, и оболочка выходит с диагностическим сообщением и состоянием выхода, отличным от 0 - точно так же, как и должно.
Что касается rc: 0 , то я ожидаю, что это какая-то специфическая для версии ошибка - вероятно, связанная с двумя триггерами для EXIT , происходящими одновременно, и с одним, получающим код выхода другого (который не должен происходить) . И в любом случае, с актуальным бинарным bash
, как установлено pacman
:
bash <<\IN
printf "shell options:\t$-\n"
trap 'echo "EXIT (rc: $?)"' EXIT
set -eu
echo ${UNSET_VAR}
IN
я добавил первую строку, чтобы вы могли видеть, что условия оболочки являются таковыми для сценарной оболочки - она не интерактивна. Вывод:
shell options: hB
bash: line 4: UNSET_VAR: unbound variable
EXIT (rc: 1)
Вот некоторые релевантные примечания из последних изменений :
$?
правильно. для команд
с неправильным номером строки. ловушкой
в асинхронных командах субоболочки. ловушек
для этих сигналов и позволяет выполнять рекурсивно большинство обработчиков ловушек
.
(запуск обработчиков trap
во время выполнения обработчика trap
) . Я думаю, что это либо последний, либо первый, который наиболее актуален - или, возможно, комбинация двух. Обработчик ловушки
по своей природе является асинхронным , поскольку вся его работа заключается в ожидании и обработке асинхронных сигналов . И вы запускаете два одновременно с -eu
и $ UNSET _ VAR
.
И, возможно, вам стоит просто обновить, но если вы любите себя, вы сделаете это с другой оболочкой вообще.
-121--15771-Просто для полноты: мы можем объединить отличный сценарий неловкости в ответе Стефана Шазеласа, и perl сценарий в ответе кос, но без сохранения всего списка в памяти, в надежде, что perl может быть быстрее, чем неловко. (Я изменил порядок аргументов, чтобы соответствовать исходному вопросу).
#!/usr/bin/env perl
use strict;
die "Usage: $0 l f\n" if $#ARGV+1 != 2;
open(L,$ARGV[0]) or die "$ARGV[0]: $!";
open(F,$ARGV[1]) or die "$ARGV[1]: $!";
while(my $number = <L>){
#chop $number;
while (<F>) {
if($. == $number){
print;
last;
}
}
}
-121--25398- Я не уверен, но, как я понимаю, я думаю: нет.
Apparmor может проводить различие между различными
. Для использования различных методов поведения apparmor в разных профилях приложений необходимо создать различных пользователей для каждого метода поведения Apparmor.
Как и Android для создания изолированных приложений под разными «пользователями».
Очень легко, мой друг. Создайте жесткую ссылку -с именем firefox -(putProfileNameHere):
cd /data/usr/lib/firefox/
sudo ln firefox /usr/bin/firefox-default
sudo ln firefox /usr/bin/firefox-1b58iygj
#etc etc etc
Создайте несколько профилей App Armor:
cd /etc/apparmor.d
cp usr.bin.firefox usr.bin.firefox-default
cp usr.bin.firefox usr.bin.firefox-1b58iygj
#etc etc etc
Измените каждый профиль по своему усмотрению.
Создавайте разные файлы.desktop в /usr//share/applications (или используйте менеджер меню, такой как Alacarte или KDE ??)для запуска пользовательских двоичных файлов + соответствующий профиль:
firefox-default
firefox-1b58iygj --profile /home/<yourUserID>/.mozilla/firefox/1b58iygj
#etc etc etc
Получайте удовольствие.
Можно либо с локальным профилем , либо с неприкрепленным профилем , либо с пространством имен .
Локальный профиль определяется с помощью
profile /usr/bin/firefox//some-name {
…
}
Неприкрепленный профиль определяется с помощью
profile Some.name {
…
}
Профиль с пространством имен определяется с помощью
profile :some-namespace:/usr/bin/firefox {
…
}
Присвоение нестандартного -профиля процессу может быть достигнуто либо самим процессом с change_profile
(, как уже было сказано ), либо с помощью свойства (systemd AppArmorProfile=
, которое должно быть определено в сервисный блок ).