Bash pwd et ouvrir avec le tuyau ne fonctionne pas

J’apprends à travailler avec la redirection d’E / S dans bash et j’ai essayé quelques exemples avec le tube comme:

pwd | say ls -l | grep "staff" > out.txt 

Mais lorsque j’essaie d’utiliser à la fois pwd et open utilisant la redirection de pipe, la commande échoue et je viens de recevoir open usage open .

Ce que j’essaie c’est: pwd | open pwd | open

Quelle est la bonne façon d’ouvrir le répertoire actuel à partir de bash?

Avec le recul, il y a 2 réponses distinctes :


A: Répondre à la question du PO comme demandé en vue de comprendre les tuyaux et les stream d’E / S :

 echo . | xargs open # Equivalent solution, using the special "$PWD" shell variable. printf '%s\0' "$PWD" | xargs -0 open 

est le moyen le plus robuste de transmettre le chemin d’access du répertoire actuel à l’interface de ligne de commande open via un canal afin qu’il ouvre ce répertoire dans l’interface utilisateur du navigateur de système de fichiers d’OSX, Finder .

Notez que pwd | xargs open pwd | xargs open n’est PAS robuste, car il échoue si le chemin du répertoire en cours contient des espaces blancs – voir ci-dessous.

  • open nécessite que l’ entrée soit fournie via des arguments de ligne de commande plutôt que via le stream d’entrée stdin , comme c’est le cas ici (via un tube, | ).
  • Ainsi, pour traduire l’entrée stdin en arguments , l’ utilitaire standard xargs est nécessaire.
  • xargs prend en entrée stdin – provenant d’un canal dans ce cas – et appelle la commande spécifiée comme argument ( open , dans ce cas) avec l’ entrée stdin tokenisée comme arguments de cette commande .
  • xargs se divise par espace par défaut :
    • Avec en tant qu’entrée, aucun fractionnement (ou interprétation par le shell) ne se produit, de sorte qu’il peut simplement être xargs sur xargs .
    • En revanche, la variable shell $PWD spéciale, qui contient toujours le chemin d’access complet du répertoire actuel, peut contenir des espaces blancs incorporés . Des étapes supplémentaires sont donc nécessaires pour garantir son open à un seul argument :
      • printf '%s\0' "$PWD" affiche le chemin complet du répertoire actuel terminé par un octet NUL ( 0x0 ).
      • Complémentairement, xargs -0 divise l’entrée stdin en jetons par NUL – ce qui donne un jeton unique dans ce cas, préservant la valeur de la ligne d’entrée unique – contenant $PWDtelle $PWD . Cela est sûr à faire, car NUL n’est pas un octet légal dans les noms de fichiers.
        • Remarque: -0 est une extension non standard du standard POSIX pour xargs , mais elle est implémentée à la fois dans BSD xargs (utilisé sur OSX) et GNU xargs (sous Linux). Restant conforme à POSIX [1] , la meilleure solution consiste à utiliser le tokenizing basé sur les lignes avec l’option -I comme suit:
          printf '%s' "$PWD" | xargs -I % open %

Ainsi, les solutions ci-dessus sont équivalentes à (ce que xargs exécute finalement – voir la section suivante pour une explication):

 open . # Equivalent solution. open "$PWD" 

[1] xarg option -I xarg nécessite un système POSIX compatible XSI . Si quelqu’un peut m’expliquer ce que cela signifie concrètement , je vous en serais reconnaissant.


B: Fournir la meilleure réponse sans contraintes sur les techniques employées :

 open . 

open attend des arguments plutôt que des entrées stdin , et . représente de manière succincte et efficace le répertoire en cours, ce qui entraîne l’ open du contenu du dossier en cours dans le Finder .

Une solution équivalente, mais plus verbeuse, consiste à passer la variable shell spéciale $PWD , qui contient toujours le chemin complet du répertoire en cours (référencé par des guillemets doubles , afin de le protéger des extensions de shell :

 open "$PWD" 

homme ouvert :

 -f Reads input from standard input and opens the results in the default text editor. End input by sending EOF character (type Control-D). Also useful for piping output to open and having it open in the default text editor. 

Même manuel, sous “Exemples”:

ls | open -f ls | open -f écrit la sortie de la commande ‘ls’ dans un fichier dans / tmp et ouvre le fichier dans l’éditeur de texte par défaut (déterminé par LaunchServices).

Vous pouvez donc faire pwd | open -f pwd | open -f

Si vous voulez ouvrir le Finder pour pwd , vous pouvez faire pwd | xargs open pwd | xargs open .