Это походит adduser
скрипт, который Вы запустили, прерван, что он запустил две различных программы установки пароля. Возможно, что первый был паролем самбы или другой альтернативной системой пароля, но это более вероятно всего две различных версии программы пароля основной системы.
Беспокойство здесь было бы то, если Ваша система поставлена под угрозу. Я проверил бы двоичные файлы против базы данных пакета и удостоверился бы, что они не были изменены на Вас. Возможно изменить такой сценарий для сбора урожая пароля путем просьбы его учетных данных дополнительное время.
cd
не внешняя команда - это - оболочка встроенная функция. Это работает в контексте текущей оболочки, и не, как внешние команды делают в fork/exec'd контексте как отдельный процесс.
Ваши третьи работы в качестве примера, потому что оболочка разворачивает переменную и замену команды прежде, чем звонить cd
встроенный, так, чтобы cd
получает значение ${HOME}
как его аргумент.
Системы POSIX действительно имеют двоичный файл cd
- на моей машине FreeBSD это в /usr/bin/cd
, но это не делает то, что Вы думаете. Вызов двоичного файла cd
вызывает оболочку к ветвлению/должностному лицу двоичный файл, который действительно изменяет его рабочий каталог на имя, которое Вы передаете. Однако, как только это делает так, двоичные выходы, и процесс forked/exec'd исчезает, возвращая Вас Вашей оболочке, которая находится все еще в каталоге, это было в том, перед запуском.
cd
не читает стандарт ввел. Именно поэтому Ваш первый пример не работает.
xargs
нуждается в названии команды, то есть, названии независимого исполняемого файла. cd
потребности быть оболочкой, встроенная команда и не имела бы никакого эффекта (кроме проверки, что можно измениться на тот каталог и потенциальные побочные эффекты, как которые это может иметь для автомонтируемых каталогов), если это был исполняемый файл. Именно поэтому Ваш второй пример не работает.
В дополнение к существующему хорошему ответу также стоит упомянуть, что канал разветвляет новый процесс, который имеет его собственный отдельный рабочий каталог. Поэтому пытаясь сделать это, не будет работать:
echo test | cd /
Таким образом Вы не будете в / папка после возвратов оболочки из этой команды.
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.
Как другие сказали, это не будет работать потому что cd
оболочка встроенная команда, не внешняя программа, таким образом, она не имеет никакого стандарта, ввела Вас, может передать что-либо по каналу в.
Но, даже если бы это работало, то это не сделало бы то, чего Вы желаете: канал порождает новый процесс и перенаправляет стандартный вывод первой команды в стандартный вход второго, таким образом только новый процесс изменил бы свой текущий рабочий каталог; это не могло влиять на первый процесс всегда.
read
обычно (всегда?) встроенная оболочка. Это верно это cd
игнорирует stdin, но это не происходит из-за того, что это было встроенным.
– dubiousjim
07.10.2012, 01:46
Другая опция является обратными галочками, которые помещают stdout одной команды как параметр командной строки второй команды и являются более портативными, чем $(...)
. Например:
cd `echo $HOME`
или в более общем плане;
cd `anycommand -and whatever args`
Обратите внимание, что использование обратных галочек зависит от оболочки для выполнения команды и замены выводом на командной строке. Большинство оболочек поддерживает его.
$(...)
работы. Я не думаю, что это - хороший совет рекомендовать обратные галочки вместо этого, так как они имеют намного более замысловатые правила заключения в кавычки и обычно более подвержены ошибкам. (См. §3.5.4 "Замена Команды" в Справочнике Bash.) $
– ruakh
05.10.2012, 20:01
$(...)
в одной системе, но не в другом??
– ruakh
05.10.2012, 20:14
$(…)
. Системы без оболочки POSIX (т.е. с подлинной Оболочкой Bourne) были бы чрезвычайно стары. Даже системы, где /bin/sh
Оболочка Bourne, и Вам нужен другой путь такой как /usr/xpg4/bin/sh
для получения оболочки POSIX редки в наше время. Рекомендация обратных галочек любому, кто не администрирует древний Unix boxen профессионально, вредит им.
– Gilles 'SO- stop being evil'
05.10.2012, 21:21
cd
команда? – kojiro 05.10.2012, 23:09