Bash pwd и открыть с неработающей трубой

Я изучаю, как работать с перенаправлением ввода/вывода в bash, и попробовал несколько примеров с этим каналом:

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

Но когда я пытаюсь использовать как pwd, так и open, используя перенаправление TCP, команда терпит неудачу, и я просто получаю open использование.

Я пытаюсь: pwd | open

Каков правильный способ открыть текущий каталог из bash?

Ответ 1

В свете ретроспективного анализа есть 2 разных ответа:


A: Чтобы ответить на вопрос OP, заданный, с целью понимания труб и потоков ввода-вывода:

echo . | xargs open

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

- самый надежный способ передать текущий путь каталога в CLI open через канал, чтобы он открыл этот каталог в графическом интерфейсе графического интерфейса файловой системы OSX, Finder.

Обратите внимание, что pwd | xargs open НЕ является надежным, потому что он терпит неудачу, если текущий путь к каталогу имеет встроенные пробелы - см. ниже.

  • open требует ввода, предоставляемого с помощью аргументов командной строки чем через входной поток stdin, как здесь (через трубу, |).
  • Таким образом, для перевода ввода stdin в аргументы требуется стандартная утилита xargs.
  • xargs принимает вход stdin - исходящий из трубы в этом случае - и вызывает команду, указанную в качестве аргумента (open, в данном случае), с входным сигналом stdin в качестве аргументов команды.
  • xargs по умолчанию пробегает пробел:
    • С . в качестве входа не происходит никакого расщепления (или интерпретации оболочки), поэтому оно может быть echo ed до xargs.
    • В отличие от этого, специальная переменная оболочки $PWD, которая всегда содержит текущий каталог. полный путь, может содержать встроенные пробелы, поэтому необходимы дополнительные шаги, чтобы обеспечить его передачу в open как один аргумент:
      • printf '%s\0' "$PWD" печатает текущий каталог. полный путь завершен с помощью NUL-байта (0x0).
      • В дополнение, xargs -0 разбивает вход stdin на токены на NUL - в результате получается один токен в этом случае, сохраняя значение единственной строки ввода - содержащее $PWD - как есть. Это безопасно, потому что NUL не является законным байтом в именах файлов.
        • Примечание: -0 является нестандартным расширением стандарта стандарта POSIX для xargs, но он реализован как в BSD xargs ( как используется в OSX) и GNU xargs (как используется в Linux). Остальной POSIX-совместимый [1] лучше всего использовать линейную токенизацию с опцией -I следующим образом:
          printf '%s' "$PWD" | xargs -I % open %

Таким образом, в действительности вышеупомянутые решения эквивалентны (что в конечном итоге выполняется xargs - см. следующий раздел для объяснения):

open . 

# Equivalent solution.
open "$PWD"
Для параметра

[1] xarg -I требуется система POSIX, которая также XSI -compliant. Если кто-нибудь может объяснить мне, что это означает в практическом плане, я был бы благодарен.


B: Чтобы обеспечить наилучший ответ без ограничений на используемые методы:

open .

open ожидает аргументы, а не stdin input, а . кратко и наиболее эффективно представляет текущий каталог, заставляя open отображать содержимое текущей папки в Finder.

Эквивалентное, но более подробное решение - передать специальную переменную оболочки $PWD, которая всегда содержит полный путь к текущему каталогу (ссылка на двойные кавычки, чтобы защитить его от расширения оболочки:

open "$PWD"

Ответ 2

man open:

-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.

То же руководство в разделе "Примеры":

ls | open -f     записывает вывод команды ls в файл в /tmp и открывает файл в      текстовый редактор по умолчанию (как определено LaunchServices).

Таким образом, вы можете сделать pwd | open -f

Ответ 3

Если вы хотите открыть Finder для pwd, вы можете сделать pwd | xargs open.