Можно проверить код состояния mount
, и большинство правильно написанных исполняемых файлов, с оболочкой специальный параметр ?
.
От man bash
:
? Expands to the exit status of the most recently executed foreground pipeline.
После выполнения mount
команда, сразу выполнившись echo $?
распечатает код состояния от предыдущей команды.
# mount /dev/dvd1 /mnt
mount: no medium found on /dev/sr0
# echo $?
32
Не все исполняемые файлы имеют четко определенные коды состояния. Как минимум это должно выйти с успехом (0) или отказом (1) код, но это не всегда имеет место.
Чтобы подробно остановиться (и корректный) на Вашем сценарии в качестве примера, я добавил вложенный if
создайте для ясности. Это не единственный способ протестировать код состояния и выполнить действие, но является самым легким читать при изучении.
#!/bin/bash
mount="/myfilesystem"
if grep -qs "$mount" /proc/mounts; then
echo "It's mounted."
else
echo "It's not mounted."
mount "$mount"
if [ $? -eq 0 ]; then
echo "Mount success!"
else
echo "Something went wrong with the mount..."
fi
fi
Для получения дополнительной информации о "Выходе и Статусе выхода", можно обратиться к Усовершенствованному Руководству по созданию сценариев Bash.
Можно использовать эту команду для резервного копирования всего dotfiles (.<something>
) в Вашем $HOME
каталог:
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
Я исследовал это вполне немного и подошел пустой. Ограничивающий фактор был бы этим когда tar
работает это, исключает, запаздывающая наклонная черта (/
) это обнаруживается с каталогами, не часть уравнения, когда tar выполняет свое соответствие шаблона.
Вот пример:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory
Этот вариант включает исключение .*/
и Вы видите с подробным переключателем, включенным к tar, -v
, то, что эти каталоги проходят, которые исключают.
Я думал, возможно, переключатели --no-wildcards-match-slash
или --wildcards-match-slash
ослабил бы жадность .*/
но это не имело никакого эффекта также.
Взятие наклонной черты из исключения, .*
не была опция ни одним, так как это скажет tar
исключить весь dotfiles и dotdirectories:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$
Таким образом, единственная другая альтернатива, которую я могу задумать, должна предоставить список файлов к tar
. Что-то вроде этого:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory
Этот подход имеет проблемы, если бы количество файлов превышает максимальную сумму пространства для передающих аргументов команде, была бы одна явная проблема. Другой то, что это ужасно и чрезмерно сложно.
Кажется, нет простого и изящного способа выполнить это использование tar
И регулярные выражения. Чтобы к комментарию @terdon, find ... | tar ...
действительно более соответствующий способ сделать это.
Этот вид управления соответствием файлам является путем вне зоны комфорта tar. Его правила для соответствия файлам ограничены простыми соответствиями по именам.
find
один путь, но так как у Вас есть zsh, у Вас есть он легче:
tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)
Это .
в круглых скобках в конце выражения с подстановочными знаками спецификатор шарика, который говорит “только соответствие регулярные файлы”.
Символьные ссылки на регулярные файлы не подобраны. Если Вы изменяетесь на .*(-.)
, они будут включены, но файл не окажется в архиве, если он не будет также включен. Если Вы хотите заменить символьную ссылку их целями, сделайте это .*(-.:A)
— :A
добавляет модификатор расширения истории, который разрешает все символьные ссылки на путь, который не использует символьные ссылки.
Этот ответ основан на slm's, но я также покажу Вам, как включать начало каталогов .
В точечные файлы на молнии в Вашем корневом каталоге:
$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +
Включать каталоги:
$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +
?
является дополнительным в первой команде, но не во втором, иначе, find
будет включать .
(текущий) каталог.
regex
, но я должен был знать, что это не будет работать тот путь :) – klingt.net 19.07.2013, 18:04regex
Вы должны будете, вероятно, выйти из ведущей точки и испытаете затруднения при игнорировании.
и..
. Я уверен, что это возможно, как slm, вероятно, продемонстрирует, но я не вижу, почему это стоило бы. – terdon♦ 19.07.2013, 18:08find
команда находит, добираются, передал как аргументtar
.{}
говорит, где Вы хотите, чтобы те результаты вошли в соответствие-exec
команда.+
говорит для добавления как много результатовfind
как будет соответствовать на командной строке и вызовеtar
только пару раз, а не каждый раз результат найден. – slm♦ 19.07.2013, 18:12regex
иtar
потому что нет никакого способа изолировать точечные каталоги (.blah/
). Tar не использует запаздывающую наклонную черту при выполнении исключения. – slm♦ 19.07.2013, 18:59