(Мне не нравится внедрять дом пользователей, я думаю, что им нужно позволить сделать независимо от того, что они хотят сделать с, они размещают …, но так или иначе …),
Это должно работать над Linux (по крайней мере). Я принимаю user
уже член группы user
. Решение состоит в том, чтобы изменить владение Directory1
и набор липкий бит на каталоге:
chown root:user Directory1
chmod 1775 Directory1
Затем использование:
chown root Directory1/CantBeDeletedFile
Теперь, user
не сможет удалить этот файл из-за липкого бита ¹. user
все еще может добавить/удалить их собственные файлы в Directory1
. Но заметьте, что они не смогут удалить Directory1
потому что это никогда не будет освобождаться.
—
1. Когда липкий бит включен на каталоге, пользователи (кроме владельца) могут только удалить свои собственные файлы в каталоге. Это используется на каталогах как /tmp
чьи полномочия 1777
=rwxrwxrwt
.
Если автоматически проверяет код возврата:
if (darcs show repo); then
echo "repo exists"
else
echo "repo does not exist"
fi
Вы могли также выполнить команду и использовать && (логичный И) или || (логичный ИЛИ) впоследствии, чтобы проверить, успешно выполнилось ли это или нет:
darcs show repo && echo "repo exists"
darcs show repo || echo "repo does not exist"
Перенаправление stdout
и stderr
может быть сделан однажды с exec
exec 6>&1
exec 7>&2
exec >/dev/null 2>&1
if (darcs show repo); then
repo="darcs"
elif (test -d .git); then
repo="git"
fi
# The user won't see this
echo "You can't see my $repo"
exec 1>&6 6>&-
exec 2>&7 7>&-
# The user will see this
echo "You have $repo installed"
Первые два exec
сохраняют stdin
и stderr
дескрипторы файлов, третьи перенаправления оба к /dev/null
(или где-нибудь другой, если пожелали). Последние два exec
восстановите дескрипторы файлов снова. Все промежуточное не перенаправляется к нигде.
Добавьте другие проверки repo как предложенный Gilles.
Ну, это не очень симпатично, но это - один способ сделать это встроенный:
if darcs show repo > /dev/null 2>&1; then <do something>; fi
По определению, если тесты код выхода команды, таким образом, Вы не должны делать явного сравнения, если Вы не хотите больше, чем успешность или неуспешность. Существует, вероятно, более изящный способ сделать это.
Поскольку другие уже упомянули, if command
тесты, ли command
успешно выполняется.Действительно? [ … ]
обычная команда, которая может использоваться за пределами if
или while
условное выражение, хотя это редко.
Однако для этого приложения, я протестировал бы существование характерных каталогов. Это будет корректно в большем количестве пограничных случаев. Версия Bash/ksh/zsh/dash (не протестирована):
vc=
if [ -d .svn ]; then
vc=svn
elif [ -d CVS ]; then
vc=cvs
else
d=$(pwd -P)
while [ -n "$d" ]; do
if [ -d "$d/.bzr" ]; then
vc=bzr
elif [ -d "$d/_darcs" ]; then
vc=darcs
elif [ -d "$d/.git" ]; then
vc=git
elif [ -d "$d/.hg" ]; then
vc=hg
fi
if [ -n "$vc" ]; then break; fi
d=${d%/*}
done
fi
if [ -z "$vc" ]; then
echo 1>&2 "This directory does not seem to be under version control."
exit 2
fi
Другая сжатая опция была бы:
[ -d .svn ] && { svn command 1; svn command 2; }