Учитывая Вас управляют init.d сценарием для запуска этого процесса, как который Вы могли бы хотеть просто перенести выполнение своего процесса в init.d сценарии так:
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
Этот будет lanch Ваш процесс в до цикла в основном навсегда, каждый раз, когда он умирает. Подсчет и т.д. мог быть представлен как это:
cnt=0
max=3
until myserver; do
let cnt=cnt+1
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
[ $cnt = $max ] && exit;
done
find . -maxdepth 1 ! -type d
]
[]Детали:[
] [][]-maxdepth 1[
] ограничивает поиск текущей директорией[
][]! -тип d[
] исключает директории[
] Причина, по которой []*/[
] совпадает с каталогами, заключается в том, что итоговый []/[
] ограничивает количество совпадений с каталогами. Этот эффект срабатывает только в том случае, если []/[
] находится после шаблона, в [] нельзя использовать [
]. В bash нет встроенной возможности делать то, что вам нужно.[]/[
] внутри скобок!(*/)[
]Вы можете сделать цикл над всеми файлами и собрать массив.[
] [non_directories=()
for x in *; do
[ -d "$x" ] || non_directories+=("$x")
done
somecommand "${non_directories[@]}"
]
[]Вы также можете использовать []find[
], если вы хотите выполнить команду над всеми файлами. Если ваша реализация find поддерживает ее (GNU, BSD, BusyBox), используйте []-mindepth[
] и []-maxdepth[
], чтобы перечислить только записи в текущих каталогах (с добавлением []./[
]). Используйте []! -имя .*'[
], чтобы пропустить файлы точек (если вы действительно хотите их пропустить).[
find . -mindepth 1 -maxdepth 1 ! -type d -exec somecommand {} +
]
[] Если вы можете предположить, что POSIX [] find[
], используйте []-prune[
], чтобы избежать повторения. [
find . -name . -o -type d -prune -o -exec somecommand {} +
]
[] Если вы хотите вставить вывод []find[
] в переменную массива, остерегайтесь, что при разборе вывода []find[
] требуются дополнительные предположения об имени файла. Лучше использовать цикл.[
]В zsh можно использовать []glob-квалификаторы[]: []*(^/)[
], или []*(...)[
], чтобы соответствовать только обычным файлам.[
] Своего рода длинная намотка, но:[
] [for f in *; do if [ ! -d "$f" ]; then echo "$f"; fi; done
]
[][]-d[
] является []файловым оператором тестирования [] для проверки, является ли аргумент каталогом.[
]Вышеуказанное можно также сократить до[
] [for f in *; do [ ! -d "$f" ] && echo "$f"; done
] ]Я не уверен, какой из 2-х вариантов вы хотите достичь - bash globing, который исключает основываясь на атрибутах файловой системы, или способ отображения только файлов в каталоге?[
] []Если первый, то я не уверен, что это возможно. Глобус просто расширяется, и имена файлов являются базой в любом каталоге - bash не различает имя файла или грязное имя по собственному.[
] []Если второй - у вас уже есть 2 ответа, другой с использованием ls: [
] [ls -dF * | grep -v "/$"
] Мое предложение:
GLOBIGNORE=$(echo */) # create list of directories with globbing
GLOBIGNORE=${GLOBIGNORE//:/\\:} # escape possible ":" with "\" to allow
# the separator ":" in directory names
GLOBIGNORE=${GLOBIGNORE//\/ /:} # replace "/ " with separator ":"
GLOBIGNORE=${GLOBIGNORE%/} # remove trailing "/"
ls -ld *
Результат: никаких каталогов
Вернуться к настройкам по умолчанию с помощью отменить GLOBIGNORE