Почему я не могу перенаправить вывод пути от одной команды до “CD”?

Это походит adduser скрипт, который Вы запустили, прерван, что он запустил две различных программы установки пароля. Возможно, что первый был паролем самбы или другой альтернативной системой пароля, но это более вероятно всего две различных версии программы пароля основной системы.

Беспокойство здесь было бы то, если Ваша система поставлена под угрозу. Я проверил бы двоичные файлы против базы данных пакета и удостоверился бы, что они не были изменены на Вас. Возможно изменить такой сценарий для сбора урожая пароля путем просьбы его учетных данных дополнительное время.

27
05.10.2012, 21:18
6 ответов

cd не внешняя команда - это - оболочка встроенная функция. Это работает в контексте текущей оболочки, и не, как внешние команды делают в fork/exec'd контексте как отдельный процесс.

Ваши третьи работы в качестве примера, потому что оболочка разворачивает переменную и замену команды прежде, чем звонить cd встроенный, так, чтобы cd получает значение ${HOME} как его аргумент.

Системы POSIX действительно имеют двоичный файл cd - на моей машине FreeBSD это в /usr/bin/cd, но это не делает то, что Вы думаете. Вызов двоичного файла cd вызывает оболочку к ветвлению/должностному лицу двоичный файл, который действительно изменяет его рабочий каталог на имя, которое Вы передаете. Однако, как только это делает так, двоичные выходы, и процесс forked/exec'd исчезает, возвращая Вас Вашей оболочке, которая находится все еще в каталоге, это было в том, перед запуском.

32
27.01.2020, 19:39

cd не читает стандарт ввел. Именно поэтому Ваш первый пример не работает.

xargs нуждается в названии команды, то есть, названии независимого исполняемого файла. cd потребности быть оболочкой, встроенная команда и не имела бы никакого эффекта (кроме проверки, что можно измениться на тот каталог и потенциальные побочные эффекты, как которые это может иметь для автомонтируемых каталогов), если это был исполняемый файл. Именно поэтому Ваш второй пример не работает.

23
27.01.2020, 19:39

В дополнение к существующему хорошему ответу также стоит упомянуть, что канал разветвляет новый процесс, который имеет его собственный отдельный рабочий каталог. Поэтому пытаясь сделать это, не будет работать:

echo test | cd /

Таким образом Вы не будете в / папка после возвратов оболочки из этой команды.

4
27.01.2020, 19:39
  • 1
    Все команды в конвейере, выполненном в различных процессах, таким образом, в a | b, даже если a и b встроены, по крайней мере один затем не работает в процессе оболочки, но нет никакой гарантии который, какой это. Например, в AT&T ksh, zsh или bash -O lastpipe, b выполняется в текущем процессе оболочки, таким образом, Ваш код взял бы Вас к / там. –  Stéphane Chazelas 23.06.2013, 00:01

В дополнение к корректным ответам, уже данным: Если Вы выполняете удар и хотите узнать то, что "команда" как CD - Вы, может использовать тип

$ type cd
cd is a shell builtin

или почему нет:

$ type time
time is a shell keyword

в то время как, например, время гну обычно уже включено в Ваше любимое распределение:

$ which time
/usr/bin/time

Okey okey Вы получаете идею, затем какого черта тип?

$ type type
type is a shell builtin

Вот отрывок руководства удара:

       type [-aftpP] name [name ...]
          With no options, indicate how each name would be interpreted  if  used  as  a
          command name.  If the -t option is used, type prints a string which is one of
          alias, keyword, function, builtin,  or  file  if  name  is  an  alias,  shell
          reserved word, function, builtin, or disk file, respectively.  If the name is
          not found, then nothing is printed, and an exit status of false is  returned.
          If  the -p option is used, type either returns the name of the disk file that
          would be executed if name were specified as a command  name,  or  nothing  if
          ‘‘type  -t  name’’ would not return file.  The -P option forces a PATH search
          for each name, even if ‘‘type -t name’’ would not return file.  If a  command
          is  hashed,  -p  and -P print the hashed value, not necessarily the file that
          appears first in PATH.  If the -a option is used,  type  prints  all  of  the
          places  that  contain  an  executable  named name.  This includes aliases and
          functions, if and only if the -p option is  not  also  used.   The  table  of
          hashed  commands  is  not  consulted when using -a.  The -f option suppresses
          shell function lookup, as with the command builtin.  type returns true if any
          of the arguments are found, false if none are found.
4
27.01.2020, 19:39

Как другие сказали, это не будет работать потому что cd оболочка встроенная команда, не внешняя программа, таким образом, она не имеет никакого стандарта, ввела Вас, может передать что-либо по каналу в.

Но, даже если бы это работало, то это не сделало бы то, чего Вы желаете: канал порождает новый процесс и перенаправляет стандартный вывод первой команды в стандартный вход второго, таким образом только новый процесс изменил бы свой текущий рабочий каталог; это не могло влиять на первый процесс всегда.

0
27.01.2020, 19:39
  • 1
    Ваш второй абзац является правильным. Но ре первый абзац: почему Вы предполагаете, что оболочка builtins не имеет никакого stdin? read обычно (всегда?) встроенная оболочка. Это верно это cd игнорирует stdin, но это не происходит из-за того, что это было встроенным. –  dubiousjim 07.10.2012, 01:46

Другая опция является обратными галочками, которые помещают stdout одной команды как параметр командной строки второй команды и являются более портативными, чем $(...). Например:

cd `echo $HOME`

или в более общем плане;

cd `anycommand -and whatever args`

Обратите внимание, что использование обратных галочек зависит от оболочки для выполнения команды и замены выводом на командной строке. Большинство оболочек поддерживает его.

-2
27.01.2020, 19:39
  • 1
    OP, уже указанный, в его вопросе, этом $(...) работы. Я не думаю, что это - хороший совет рекомендовать обратные галочки вместо этого, так как они имеют намного более замысловатые правила заключения в кавычки и обычно более подвержены ошибкам. (См. §3.5.4 "Замена Команды" в Справочнике Bash.) $ –  ruakh 05.10.2012, 20:01
  • 2
    () хорош, где поддерживается, но обратные галочки более широко поддерживаются через различные оболочки и системы. Но я должен перефразировать это как "другая опция". –  Seth Noble 05.10.2012, 20:07
  • 3
    Различные оболочки, да; но различные "системы"? Есть ли действительно любые оболочки, которые будут поддерживать $(...) в одной системе, но не в другом?? –  ruakh 05.10.2012, 20:14
  • 4
    1, это не отвечает на вопрос вообще. –  Bernhard 05.10.2012, 20:17
  • 5
    @ruakh &Seth: Весь POSIX окружает поддержку $(…). Системы без оболочки POSIX (т.е. с подлинной Оболочкой Bourne) были бы чрезвычайно стары. Даже системы, где /bin/sh Оболочка Bourne, и Вам нужен другой путь такой как /usr/xpg4/bin/sh для получения оболочки POSIX редки в наше время. Рекомендация обратных галочек любому, кто не администрирует древний Unix boxen профессионально, вредит им. –  Gilles 'SO- stop being evil' 05.10.2012, 21:21

Теги

Похожие вопросы