2010-02-11 8 views
1

J'essaie de comprendre comment utiliser git filter-branch et j'ai besoin d'aide pour certaines commandes de base de scripts Linux.Comment fonctionne cette commande shell compliquée (contenant |, && et sed)?

'git ls-files -s | sed "s-\t-&newsubdir/-" | 
       GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
         git update-index --index-info && 
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 

Est-ce que quelqu'un peut me décomposez et expliquer chaque partie?

Je suis plus intéressé par le '|' notation, la notation & &, et la commande sed.

+0

Cela n'a probablement pas d'importance dans ce cas, mais en général, il existe plusieurs langages de script sous linux. La première ligne du fichier devrait vous dire lequel, vous devez inclure cette information dans votre question. –

+0

@John: Cet extrait est probablement dans un fichier de contrôle git, ce qui signifie que le shell spécifique est déjà bien défini ou est complètement inconnu. –

Répondre

1

| connecte stdout de la commande précédente à stdin de la commande suivante.

&& exécute la commande suivante si le code de retour de la commande précédente est 0 (c'est-à-dire que la commande a réussi).

La commande s dans sed est une substitution . Il recherche une correspondance regex pour le premier argument et la remplace par la seconde. Le séparateur d'argument est traditionnellement /, mais il utilisera le premier caractère qui suit, - dans ce cas. Le & dans le remplacement est remplacé par le match entier.

+0

Merci! Alors juste pour clarifier: La toute première commande listera les fichiers, à partir de cette sortie sed remplacera \ t par "newsubdir" et ensuite la sortie de sed sera définie comme le nouveau $ GIT_INDEX_FILE.new. – dirtytofu

+1

Pas tout à fait. sed va remplacer '\ t' par' \ tnewsubdir', puis le rediriger vers 'git update-index --index-info', et si cela réussit, il renommera un fichier. Le prologue de 'git update-index' est utilisé pour définir une variable d'environnement uniquement pour l'exécution de la commande. –

+0

Le résultat de 'sed' ne sera-t-il pas redirigé vers' GIT_INDEX_FILE = $ GIT_INDEX_FILE.new' avant le 'git update-index --index-info'? – dirtytofu

2

"|" est la commande unix pipe qui connecte la commande sur la sortie de gauche à la commande sur l'entrée du côté droit.

« & & » est le unix « et » commande qui exécutera la commande sur son droit si et seulement si la commande sur son gauche se termine avec succès

« sed » est le « éditeur de flux » unix un puissant outil d'édition qui analyse et édite son entrée

Questions connexes