Diga que estou fazendo isso:
cd subdir
git init
cd ../
Existe uma maneira de fazer isso com um único comando, ou talvez dois, em vez de precisar entrar e sair de um diretório para executar um comando lá?
(Não está procurando uma solução específica para o git; isso é apenas um exemplo.)
$?
conterá o código de saída do último comando executado no subshell. Se você usar a&&
variante (que normalmente deveria), obterá o código de saída do primeiro comando que falhou (ou 0, se tudo der certo).Eu estava procurando uma maneira de executar o comando git a partir de um caminho e fazer alterações no repositório em um caminho diferente. Então, acabei nesta pergunta aqui.
Mas, para minhas necessidades específicas, nem a resposta aceita nem nenhuma das outras ajudaram.
Eu precisava executar comandos git usando
sudo -u USER /usr/bin/git
(outro usuário executando). E como você deve saber, o sudo não me permite executar ocd
comando, então não posso estar no diretório do repositório.Então, eu fui para a página de manual do git . E entre as opções, vi o
--git-dir=<path>
:Portanto, se isso ajudar alguém, você ainda poderá usar o git de um caminho e fazer alterações em um repositório "longe de você". Apenas use:
ou, para executá-lo como outro usuário, faça algo como:
Também na página do manual do git-init :
Portanto, se você deseja iniciar o repositório na pasta .git usual, precisará especificá-lo junto com a
--git-dir
opção por exemplo:Após inicializar o repositório
/path/to/repo/.git
, todos os comandos adicionais devem ter a opção--work-tree=<path>
, conforme descrito na página de manual do git:Portanto, o comando certo para executar o git como outro usuário e inicializar um novo repositório é:
fonte
sudo -i
ousudo su
obter um shell raiz interativo.( cd subdir && sudo -u USER /usr/bin/git init )
que não funcionaria.subdir
?Não é exatamente o que você está perguntando (você tem respostas reais acima com o subshell), mas observe
pushd
epopd
fonte
Você tem poucas opções. Você pode agrupar os comandos com
&&
ou;
. Como isso:ou
A diferença entre eles é que, no primeiro exemplo, se um dos comandos falhar, ele não executará o restante. No segundo exemplo, todos os comandos serão executados, não importa o quê.
Outra opção seria definir uma função e usá-la, por exemplo:
Então você pode executar o comando:
E ele entrará automaticamente
git init
nesse diretório e sairá dele.Você também pode fazer uma solução mais complexa usando uma função se tiver vários diretórios e desejar
git init
com um único comando.Você pode executar isso com:
E ele vai fazer
git init
nosubdir1
,subdir2
esubdir3
.fonte
&&
e;
, mas esperava algo mais elegante. Parece que escrever um script é a minha melhor opção.cdinit
função pode ser generalizada para comandos arbitrários? Tentei usar apenas os argumentos, mas isso não funcionou.;
, de modo que a função de três linhas é equivalente acd $1; git init; cd ..
. (2) Você deve citar suas variáveis:"$1"
,"$@"
e"$arg"
. Ou você pode abreviarfor arg in "$@"
parafor arg
.No caso de
git
(pelo menos na versão 2.7.0), você pode aproveitar a-C
opção que faz o git se comportar como se tivesse sido iniciado no diretório fornecido. Portanto, sua solução pode parecer com:Citando a documentação:
fonte
Você pode agrupar os comandos com &&, ou seja,
Se você não deseja nenhuma dependência do código de saída de cada comando, pode usar; em vez disso, ou seja:
fonte
;
para que eles não dependam do código de retorno do anterior.cd subdir && git init ; cd ..
realmente pode fazer mais sentido. Se o usuário deseja executar ogit init
comando nosubdir
diretório, provavelmente não deseja executar o comando no diretório atual; ou seja, eles não querem executá-lo se o (primeiro)cd
falhar. (Embora seja possível que acd
falha falhe porque já estamos nosubdir
, mas esse é um caso de canto.) ... (continua)cd
fazer backup no diretório inicial, mesmo que ogit init
comando falhe. ( Ou eles podem ficar no subdiretório e diagnosticar a falha do comando.) (2) Você não precisa incluir o/
depois..
.Você precisa entrar no diretório de destino se o comando não tiver um parâmetro de nome de arquivo ou diretório.
Mas você pode escrever um script bash que usa o diretório de destino e o comando como parâmetros. Para isso, você pode dar uma olhada em pushd e popd: http://ss64.com/bash/pushd.html
Eu escreveria esse pequeno script para você, mas não tenho uma caixa do Linux aqui :)
fonte
Os programas têm maneiras diferentes de lidar com argumentos; portanto, alguns terão algum equivalente da opção -folder = name . Além dessa exceção, o padrão, mesmo no MS DOS, é simplesmente
subdiretório $ program
Às vezes você precisa
$ program subdir /
O programa abrirá a pasta, trabalhará com ela da mesma maneira que você trabalha com um arquivo e, quando terminar, retornará o controle ao seu shell, apontado para o diretório padrão original. Os programas tratados dessa maneira têm o problema de que as saídas de erro (como core dumps) vão para um arquivo no diretório atual do seu shell (em vez de subdiretê-lo ).
Não há solução alternativa, a menos que o programa tenha opções de comando disponíveis para especificar um local diferente. Alguns programadores tiram licença artística entre "o programa de diretório foi chamado de " e "o programa de diretório foi instruído a trabalhar ".
fonte