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, |
). 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 :
xargs
sur xargs
. $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
). 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 $PWD
– telle $PWD
. Cela est sûr à faire, car NUL n’est pas un octet légal dans les noms de fichiers.
-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
.