Что означает «cd &»?

8

Я знаю, как изменить каталог с терминала, набрав

cd <directory>

но вот сценарий. Я использовал терминал, чтобы зайти в папку моего репозитория git.

  • glennRepositories
    • Glenn-remdroid-хранилище

Учитывая структуру папок выше, я хочу включить, glenn-remdroid-repositoryпотому что это мой репозиторий.

cd glennRepositories

Перед переключением в glenn-remdroid-repository я по ошибке набрал команду

cd & 

вместо cd *. Я использовал, cd *потому что имя папки длинное для меня, извините за то, что ленивый.

Когда я выполняю cd &, терминал отвечает

[1] 7519

Когда я выполняю cd *это сейчас произошло

[1]+  Done                    cd  (wd: ~/glennRepositories)
(wd now: ~/glennRepositories/glenn-remdroid-repository)

Кто-нибудь что cd &значит и выводит? Google не знает мой вопрос :)

Glenn
источник
1
Что-то, что не может быть найдено с Google, является ogooglebar , шведским неологизмом.
Хлоя
Когда я набираю вопрос, результат поиска был о компакт-диске. Ungoogleable :)
Гленн
3
«Я использовал cd *, потому что имя папки длинное для меня, извините за ленивость». Просто введите cd <TAB>и имя уникальной папки будет расширен автоматически.
Бакуриу

Ответы:

20

Написав в &конце командной строки, вы даете команду своей оболочке взять командный конвейер (в данном случае одну команду) и запустить его в под-оболочке в фоновом режиме (не ожидая результата). cdэто встроенный bash, но это не важно здесь. Это никак не повлияет на вашу «родительскую» оболочку, поэтому ваш рабочий каталог не изменится.

[1] 7519

Эта строка сообщает, что в фоновом режиме выполняется задание, идентифицированное номером 1, а идентификатор процесса - 7519. Аналогичная вещь будет напечатана, если вы запустите, например, vimи затем нажмите Ctrl+, Zчтобы приостановить его. Когда процесс завершится, оболочка не сообщит об этом до следующего цикла обработки (например, просто нажмите Returnеще раз), а затем напечатает список обновленных заданий.

Для получения более подробной информации, пожалуйста, прочитайте man bashи раздел JOB CONTROL.

Для справки вопрос почему exit &не работает? имеет некоторое сходство.

Мирослав Кошкар
источник
От того, будет ли оболочка получено сообщение о завершении задания сразу или при следующем приглашении. В fishи zshэто сразу сообщается. В bashи других оболочках POSIX или (t) csh это зависит от настройки notifyпараметра (по умолчанию отключено) ( zshпоскольку оболочка, подобная POSIX, также имеет notifyпараметр, но по умолчанию она отключена, если не указано эмулировать другую оболочку)
Стефан Chazelas
1

&Оператор посылает процесс в фоновом режиме; как cdможно запустить без аргументов, вы запускаете его и отправляете в фоновый режим. Если вы возьмете справочную страницу:

ИМЯ

cd - изменить рабочий каталог оболочки.

СИНТАКСИС

cd[ -L| -P] [ dir ]

ОПИСАНИЕ

Измените рабочий каталог оболочки.

Измените текущий каталог на DIR . DIR по умолчанию - это значение HOMEпеременной оболочки.

Переменная CDPATHопределяет путь поиска для каталога, содержащего DIR . Альтернативные имена каталогов в CDPATHдвоеточии (:).
Нулевое имя каталога совпадает с текущим каталогом. Если DIR начинается с косой черты ( /), то CDPATHне используется.

Если каталог не найден и установлена ​​опция оболочки cdable_vars, предполагается, что слово является именем переменной. Если эта переменная имеет значение, ее значение используется для DIR .

Опции:

-Lпринудительно использовать символические ссылки,
-Pиспользуя физическую структуру каталогов без следующих символических ссылок

По умолчанию используются символические ссылки, как если бы они -Lбыли указаны.

Статус выхода:

Возвращает 0, если каталог изменился; ненулевое в противном случае.

СМОТРИТЕ ТАКЖЕ

bash(1)

РЕАЛИЗАЦИЯ

GNU bash, версия 4.1.5 (1) -релиз (i486-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
Лицензия GPLv3 +: GNU GPL версии 3 или новее

Вы можете видеть, что аргументы необязательны. Так

cd &обрабатывается как cdи затем отправляется на задний план. Когда cdвызывается без аргумента, обработка не требуется. Таким образом, он уходит на задний план, как «сделано» (обработано).

Некоторая информация о & Bash &(амперсанд) - встроенный оператор управления, используемый для разветвления процессов. Со страницы руководства Bash: «Если команда завершается оператором управления &, оболочка выполняет команду в фоновом режиме в подоболочке».

При входе в интерактивную оболочку процессу присваивается номер задания и отображается дочерний PID. Номер задания ниже один.

bash$ sleep 30 &
[1] 3586

Обратите внимание, что когда процесс разветвляется, дочерний PID сохраняется в специальной переменной $!

bash$ echo $!
3586

Вы можете прекратить работу по номеру вакансии следующим образом:

bash$ jobs
[1]+ Running sleep 30 &
bash$ kill %1
[1]+ Terminated sleep 30
bash$
vfbsilva
источник
5
Близко, но не совсем. Сначала это не то, что cdзапускается, а потом отправляется на задний план. Фоновый процесс фактически создается до запуска программы в случае обычной команды; в случае встроенного, это поведение эмулируется. Команда запускается этим фоновым процессом, заменяя его. Во- вторых, cdбез аргументов , делает что - то делать: он принимает вас в HOMEкаталог. Но, поскольку вы разветвляли его на задний план, в этом случае эффекта нет.
Уоррен Янг
@WarrenYoung с man-страницы, на которой написано, что cd возьмет домашний каталог, если ему не присвоено значение. При успешном изменении каталога он не получает значение $ pwd?
vfbsilva
1
Это влияет на текущий рабочий каталог фонового процесса , а не на переднюю оболочку Bash.
Уоррен Янг