Сценарий Bash для обнаружения системы управления версиями путем тестирования статуса возврата команды

(Мне не нравится внедрять дом пользователей, я думаю, что им нужно позволить сделать независимо от того, что они хотят сделать с, они размещают …, но так или иначе …),

Это должно работать над Linux (по крайней мере). Я принимаю user уже член группы user. Решение состоит в том, чтобы изменить владение Directory1 и набор липкий бит на каталоге:

chown root:user Directory1
chmod 1775 Directory1

Затем использование:

chown root Directory1/CantBeDeletedFile

Теперь, user не сможет удалить этот файл из-за липкого бита ¹. user все еще может добавить/удалить их собственные файлы в Directory1. Но заметьте, что они не смогут удалить Directory1 потому что это никогда не будет освобождаться.


1. Когда липкий бит включен на каталоге, пользователи (кроме владельца) могут только удалить свои собственные файлы в каталоге. Это используется на каталогах как /tmp чьи полномочия 1777=rwxrwxrwt.

11
03.06.2015, 17:56
4 ответа

Если автоматически проверяет код возврата:

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.

15
27.01.2020, 19:57
  • 1
    Хороший и чистый, однако эти методы распечатывают сообщения пользователю. Я предпочел бы, чтобы сценарий был тих (я добавил это к вопросу). –  Niall Murphy 13.12.2010, 20:55
  • 2
    , Почему Вы выполняете их в подоболочке? Это является ненужным. –  Chris Down 03.12.2011, 18:09

Ну, это не очень симпатично, но это - один способ сделать это встроенный:

if darcs show repo > /dev/null 2>&1; then <do something>; fi

По определению, если тесты код выхода команды, таким образом, Вы не должны делать явного сравнения, если Вы не хотите больше, чем успешность или неуспешность. Существует, вероятно, более изящный способ сделать это.

2
27.01.2020, 19:57

Поскольку другие уже упомянули, 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
4
27.01.2020, 19:57

Другая сжатая опция была бы:

[ -d .svn ] && { svn command 1; svn command 2; } 
0
27.01.2020, 19:57

Теги

Похожие вопросы