Если вы хотите запускать последовательно, код выхода — это все, что вам нужно;
command && echo "it worked"
или
command || echo "we are having a bad day"
Если терминал gnome -или sshpass не возвращают правильный код возврата, отправьте отчет об ошибке и используйте альтернативу.
Если вы хотите работать параллельно, используйте xargs-P или parallel , где
exit status is the combination of the exit statuses of each command ran, ORed together. (Thus, if any one command exits nonzero, parallel as a whole will exit nonzero.)
Если одна из ваших команд возвращается до выполнения, используйте альтернативу или заставьте свои команды использовать шаблон асинхронного проектирования (re -изобрести колесо ), например, добавив
; echo $(date) $? > task1.r
затем ожидание завершения всех задач;
while [ $(cat task*.r 2>/dev/null | wc -l) -lt $TASK_COUNT ] ; do
sleep 1
done
grep -P " [^0]$" task*.r && echo "we are having a bad day"
Ваш сценарий выбирает каталоги , а также файлы, не являющиеся каталогами -, и перемещает их в подкаталоги на основе их имен, даже если они представляют собой однобуквенные каталоги -, по которым мы сортируем вещи. в. Так появляются новые каталоги. Ваш код также без необходимости использует sed
и tr
и т. д., чтобы делать то, что оболочка bash
может делать сама по себе быстрее и безопаснее, и ls
никогда не следует использовать в скриптах для перебора имен файлов (, см., например. "Почему *не *parse `ls`(и что делать вместо )?"почему ).
Другая проблема заключается в том, что если у вас есть много тысяч файлов с именами, начинающимися с одного и того же символа, то команда mv "$first"* tmp/
(или втораяmv
)могут завершиться ошибкой «слишком длинный список аргументов» (. ] см. например " Слишком длинный список аргументов для ls "; проблема относится и к mv
, а не только кls
).
Пример скрипта, который устраняет эти проблемы и использует только функциональные возможности bash
, кроме mkdir
и mv
:
#!/bin/bash
shopt -s nullglob # makes the loop not loop at all if there are no files
for name in *; do
if [[ -d $name ]] && [[ $name == ? ]]; then
# skip directories that have single character names
continue
fi
# get first character in filename
first=${name:0:1}
# compute destination directory name from this first
# character by uppercasing it
destdir=${first^}
# make that directory if it does not already exist
mkdir -p -- "$destdir"
# move the file into place (name collisions not checked for)
mv -- "$name" "$destdir"
done
Параметры --
в вызовах mkdir
и mv
предназначены для защиты от имен файлов, которые могут начинаться с тире (, см., например,. " Что означает " --" (двойное -тире )? " ).
Основное отличие этого скрипта в том, что я перебираю имена в каталоге, а не первые символы, как вы.