Вы можете использовать произвольную команду, например ls
, чтобы проверить файлы и удалить их в одной строке
ls /tmp/bbsnode{1,2,3,4} &>/dev/null && rm /tmp/bbsnode{1,2,3,4}
Обратите внимание, что в целом небезопасно делать такие вещи в / tmp, потому что любой другой пользователь может создать конфликтующие файлы с одинаковыми именами.
Краткое объяснение:
Возвращаемое значение ls
не равно нулю, если один из файлов не существует. {1,2,3,4}
- это расширение скобок: оно расширяется до строки для каждого числа: поэтому / tmp / bbsnode {1,2,3,4}
является то же, что и / tmp / bbsnode1 / tmp / bbsnode2 / tmp / bbsnode3 / tmp / bbsnode4
. &&
выполняет следующую команду, только если предыдущая команда имеет нулевое возвращаемое значение, и поэтому здесь rm
выполняется, только если все 4 файла существуют. Наконец, &> / dev / null
подавляет вывод ls
( &>
перенаправляет как stdout
, так и stderr
, / dev / null
избавляется от него).
Ниже другое решение только со встроенными командами оболочки. Это похоже на то, что ответили другие, но без дополнительной функции или скрипта:
set -- /tmp/bbsnode{1,2,3,4}
(for f; do test -f "$f" || exit; done) && rm -- "$@"
Это можно сделать тремя способами.
Вместо использования оболочки, встроенной -в команду ulimit
, используйте команды, разработанные для этой цели, из различных наборов инструментов семейства daemontools -:
softlimit
из daemontools softlimit
из фридта softlimit
из daemontools -бис softlimit
из ноша s6-softlimit
из с6 chpst
от рунит runlimit
от преступника Таким образом, можно запустить, используя softlimit
из набора инструментов nosh в качестве примера:
gnome-terminal -t A --tab -e "softlimit --coresize unlimited./app1"
Это ограничение также применяется к процессу эмулятора терминала. В этом случае это будет довольно доброкачественно. Но если кто-то применяет другие ограничения, такие как ограничения дескрипторов открытых файлов или ограничения разветвления процессов, это может быть проблематично.
(ulimit -c unlimited ; urxvt -e "./app1")
Обратите внимание, что это не будет работать с терминалом GNOME или клиентским -серверным вариантом Unicode RXVT . Оба они не вызывают напрямую эмулятор терминала как дочерний элемент вашего скрипта. Они выполняют удаленный вызов через серверный процесс, который не будет иметь ограничений ресурсов, установленных в вашем сценарии, и не получит их.
ulimit
. Помните, что вы должны строить это снизу вверх.
ulimit -c unlimited ; exec "./app1"
sh
, он должен быть одним аргументом после -c
, поэтому его необходимо заключить в кавычки:sh -c "ulimit -c unlimited ; exec \"./app1\""
sh
терминалу GNOME, он также должен быть одним аргументом после -e
,поэтому необходимо применить второй уровень цитирования:gnome-terminal -e 'sh -c "ulimit -c unlimited ; exec \"./app1\""'
ulimit -c
не даст вам жесткого ограничения, оно даст вам мягкое ограничение. Жесткий лимит может быть изменен только суперпользователем, а мягкий лимит может быть изменен кем угодно. Изменение мягкого ограничения повлияет только на этот процесс.
В MacOS:
$ charlie on macbook in ~
❯❯ ulimit -aS
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 7168
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
$ charlie on macbook in ~
❯❯ ulimit -aH
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) unlimited
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 65532
cpu time (seconds, -t) unlimited
max user processes (-u) 1064
virtual memory (kbytes, -v) unlimited
В вашем случае жесткое ограничение, скорее всего, не ограничено, а мягкое ограничение по умолчанию равно 0. Вы можете изменить мягкое ограничение в этом процессе либо с помощью ulimit
, либо непосредственно отредактировав файл /proc/FD/limits
.