Скажи, что я делаю это:
cd subdir
git init
cd ../
Есть ли способ сделать это с помощью одной команды или, возможно, двух, вместо того, чтобы входить и выходить из каталога, чтобы выполнить там команду?
(Не искать специфическое для git решение; это всего лишь пример.)
$?
будет содержать код завершения последней команды, которая выполнялась в подоболочке. Если вы используете&&
вариант (который вы обычно должны), то вы получите код выхода первой команды, которая не прошла (или 0, если все прошло нормально).Я искал способ выполнить команду git из пути и внести изменения в хранилище по другому пути. Так что я оказался в этом вопросе здесь.
Но для моих конкретных нужд не помог ни принятый ответ, ни какой-либо другой.
Мне нужно было запускать команды git
sudo -u USER /usr/bin/git
(другой пользователь запускает его). И, как вы, возможно, знаете, sudo не позволяет мне запускатьcd
команду, поэтому я не могу находиться в каталоге репозитория.Итак, я пошел на страницу руководства Git . И среди вариантов я увидел
--git-dir=<path>
:Так что, если это кому-то поможет, вы все равно можете использовать git с пути и вносить изменения в хранилище «далеко от вас». Просто используйте:
или, чтобы запустить его от имени другого пользователя, сделайте что-то вроде:
Также со справочной страницы git-init :
Итак, если вы хотите запустить репозиторий из обычной папки .git, вам нужно будет указать его вместе с
--git-dir
опцией. например:После инициализации репозитория
/path/to/repo/.git
все последующие команды должны иметь опцию--work-tree=<path>
, как описано на справочной странице git:Итак, правильная команда для запуска git от имени другого пользователя и инициализации нового репозитория:
источник
sudo -i
илиsudo su
получить интерактивную корневую оболочку.( cd subdir && sudo -u USER /usr/bin/git init )
бы не работать.subdir
?Не совсем то, что вы спрашиваете (у вас есть реальные ответы выше с подоболочки), но посмотрите на
pushd
иpopd
источник
У вас есть несколько вариантов. Вы можете сгруппировать команды с помощью
&&
или;
. Нравится:или же
Разница между ними заключается в том, что в первом примере, если одна из команд не выполнена, остальные не будут выполнены. Во втором примере все команды будут выполняться независимо от того, что.
Другой вариант - определить функцию и использовать ее, например:
Затем вы можете запустить команду:
И он автоматически попадет
git init
в этот каталог и переместится из него.Вы также можете сделать более сложное решение, используя функцию, если у вас есть несколько каталогов и вы хотите
git init
их с помощью одной команды.Затем вы можете запустить это с:
И он будет делать
git init
вsubdir1
,subdir2
иsubdir3
.источник
&&
и;
, но надеялся на что-то более элегантное. Похоже, написание сценария - мой лучший вариант.cdinit
функция может быть обобщена для произвольных команд? Я пытался использовать только аргументы, но это не сработало.;
строка эквивалентна , так что трехстрочная функция эквивалентнаcd $1; git init; cd ..
. (2) Вы должны процитировать переменные:"$1"
,"$@"
и"$arg"
. Или вы можете сократитьfor arg in "$@"
доfor arg
.В случае
git
(по крайней мере, в версии 2.7.0) вы можете использовать-C
опцию, которая заставляет git вести себя так, как если бы он был запущен в данном каталоге. Таким образом, ваше решение может выглядеть так:Цитирование документации:
источник
Вы можете сгруппировать команды с &&, т.е.
Если вы не хотите никакой зависимости от кода завершения каждой команды, вы можете использовать; вместо этого, то есть:
источник
;
тем, чтобы они не зависели от кода возврата предыдущего.cd subdir && git init ; cd ..
самом деле может иметь смысл. Если пользователь хочет выполнитьgit init
команду вsubdir
, то он, вероятно, не хочет запускать команду в текущем каталоге; то есть, они не хотят запускать его, если (первый)cd
не работает. (Хотя вполне возможно, чтоcd
неудачи, потому что мы уже вsubdir
, но это угловой случай.)… (Продолжение)cd
резервное копирование в начальный каталог, даже еслиgit init
команда не выполнена. ( Или они могут захотеть остаться в подкаталоге и диагностировать сбой команды.) (2) Вам не нужно включать/
после..
.Вам нужно перейти в целевой каталог, если команда не имеет имени файла или параметра имени каталога.
Но вы можете написать bash-скрипт, который принимает целевой каталог и команду в качестве параметров. Для этого вы можете взглянуть на pushd и popd: http://ss64.com/bash/pushd.html
Я написал бы этот маленький сценарий для вас, но у меня нет коробки с Linux здесь :)
источник
Программы имеют разные способы обработки аргументов, поэтому некоторые из них будут иметь эквивалентный параметр -folder = name . Помимо этого, стандарт, даже на MS DOS, просто
$ program subdir
Иногда нужно
$ program subdir /
Программа откроет папку, будет работать с ней так же, как вы работаете с файлом, и после ее завершения вернете управление вашей оболочке, которая указывает на исходный стандартный каталог. Программы, которые обрабатываются таким образом, ДЕЙСТВИТЕЛЬНО имеют проблему с тем, что выходные данные ошибок (например, дампы ядра) идут в файл в текущем каталоге вашей оболочки (а не в подкаталоге )
Обходного пути нет, если в программе нет доступных переключателей команд для указания другого места. Некоторые программисты берут художественную лицензию между «директорией была вызвана программа » и «директивной программой было приказано работать ».
источник