Linux амперсанд в конце команды

Обновлено: 04.07.2024

Быстрый: 2>&1 перенаправляет stderr на stdout, но что означает амперсанд? Я знаю, что если бы у нас был 2 > 1 , он бы выводился в файл с именем 1 , что делает амперсанд?

Он копирует файловый дескриптор 1 в файловый дескриптор 2. FD2 - это stderr, а FD1 - это stdout, поэтому вместо этого он переводит любой вывод на stderr на stdout.

амперсанд ничего не делает - это символ в операторе 2>&1 , а не самостоятельная вещь.

Bash поддерживает несколько операторов перенаправления, 2>&1 Оператор или оператор &> связывают вместе потоки процесса до или после перенаправления.

Итак, 2>&1 дублирует fd 1 на fd 2.

& в &1 дублирует файловый дескриптор 1 . Дублированный дескриптор на самом деле ведет себя не как копия, а как псевдоним старого. Дублирование 1 позволяет перенаправлять несколько потоков на 1 без перезаписи друг друга.

Обратите внимание, что 1 перезаписал то, что написал 2 . Но не тогда, когда мы используем & :

Дескриптор файла - это дескриптор файла (или другого ресурса ввода / вывода, такого как канал или сетевой сокет). Когда 1 и 2 отдельно перенаправляются на tmp (как в первом примере), они перемещают свой указатель файла tmp независимо. Вот почему файловые дескрипторы перезаписывают друг друга.

[Дублирующиеся файловые дескрипторы] относятся к одному и тому же открытому описанию файла и, таким образом, совместно используют флаги смещения файла и состояния файла; например, если смещение файла изменяется с помощью lseek (2) для одного из дескрипторов, смещение также изменяется для другого.

Обратите внимание, что даже если & действует как псевдоним, 2>&1 означает перенаправление 2 на поток, на который 1 в в настоящее время указывает. Когда 1 перенаправляется на что-то другое, 2 указывает на тот же файл, который он сделал, независимо от 1 .

2>&1 перенаправляет стандартную ошибку (дескриптор файла 2) в тот же файл, что и стандартный вывод (дескриптор файла 1) в настоящее время .

Это также зависит от позиции, поэтому:

Фактически отправит стандартную ошибку на x и стандартный вывод на y следующим образом:

В данной главе мы будем учиться размещать более одной команды в командной строке, используя для этого операторы управления . Также мы кратко обсудим связанные с этими операторами параметры ($?) и вопросы использования аналогичных операторам специальных символов (&).

Точка с запятой (;)

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

Амперсанд (&)

Технические подробности выполняющихся при использовании рассматриваемого оператора операций приведены в разделе, посвященном процессам .

Символ доллара со знаком вопроса ($?)

Код завершения предыдущей команды сохраняется в переменной командной оболочки с именем $? . На самом деле $? является параметром командной оболочки, а не ее переменной, так как вы не можете присвоить значение переменной $? .

Двойной амперсанд (&&)

Командная оболочка будет интерпретировать последовательность символов && как логический оператор "И" . При использовании оператора && вторая команда будет исполняться только в том случае, если исполнение первой команды успешно завершится (будет возвращен нулевой код завершения). Во втором примере используется тот же принцип работы логического оператора "И" . Данный пример начинается с использования работоспособного варианта команды cd с последующим исполнением команды ls , после чего используется неработоспособный вариант команды cd , после которого команда ls не исполняется .

Двойная вертикальная черта (||)

Оператор || представляет логическую операцию "ИЛИ" . Вторая команда исполняется только тогда, когда исполнение первой команды заканчивается неудачей (возвращается ненулевой код завершения). В следующем примере используется тот же принцип работы логического оператора "ИЛИ" .

Комбинирование операторов && и ||

Вы можете использовать описанные логические операторы "И" и "ИЛИ" для создания структур условных переходов в рамках строк команд. В данном примере используется команда echo для вывода информации о том, успешно ли отработала команда rm .

Экранирование специальных символов (\)

Символ обратного слэша \ позволяет использовать управляющие символы без их интерпретации командной оболочкой; процедура добавления данного символа перед управляющими символами называется экранированием символов .

Обратный слэш в конце строки

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

Практическое задание: операторы управления

0. Ответ на каждый из вопросов может быть представлен с помощью единственной строки команды!

1. Какой бинарный файл исполняется при вводе команды passwd ?

2. Какого типа данный файл?

3. Выполните команду pwd два раза. (Помните о пункте 0.)

4. Выполните команду ls после команды cd /etc , но только в том случае, если исполнение команды cd /etc завершилось без ошибок.

5. Выполните команду cd /etc после команды cd etc , но только в том случае, если исполнение команды cd etc завершилось ошибкой.

6. Выведите строку "сработало" в случае успешного завершения исполнения команды touch test42 или строку "не сработало" в случае неудачного завершения. Все операторы должны находиться в одной строке и исполняться с привилегиями обычного пользователя (не пользователя root). Протестируйте полученную команду в вашей домашней директории и директории /bin/ .

7. Выполните команду sleep 6 ; для чего предназначена эта команда?

8. Выполните команду sleep 200 в фоновом режиме (без ожидая завершения ее исполнения).

9. Создайте строку команды, в рамках которой будет исполняться команда rm file55 . Ваша строка команды должна выводить строку 'удалось' в том случае, если файл file55 был удален и строку 'не удалось' в случае возникновения проблем.

10 (необязательное задание). Используйте команду echo для вывода строки "Hello World со странными' символами \ * [ >

\\ ." (включая все кавычки).

Корректная процедура выполнения практического задания: операторы управления

0. Ответ на каждый из вопросов может быть представлен с помощью единственной строки команды!

1. Какой бинарный файл исполняется при вводе команды passwd ?

2. Какого типа данный файл?

3. Выполните команду pwd два раза. (Помните о пункте 0.)

4. Выполните команду ls после команды cd /etc , но только в том случае, если исполнение команды cd /etc завершилось без ошибок.

5. Выполните команду cd /etc после команды cd etc , но только в том случае, если исполнение команды cd etc завершилось ошибкой.

6. Выведите строку "сработало" в случае успешного завершения исполнения команды touch test42 или строку "не сработало" в случае неудачного завершения. Все операторы должны находиться в одной строке и исполняться с привилегиями обычного пользователя (не пользователя root). Протестируйте полученную команду в вашей домашней директории и директории /bin/ .

7. Выполните команду sleep 6 ; для чего предназначена эта команда?

Осуществляется ожидание в течение 6 секунд

8. Выполните команду sleep 200 в фоновом режиме (без ожидая завершения ее исполнения).

9. Создайте строку команды, в рамках которой будет исполняться команда rm file55 . Ваша строка команды должна выводить строку 'удалось' в том случае, если файл file55 был удален и строку 'не удалось' в случае возникновения проблем.

10 (необязательное задание). Используйте команду echo для вывода строки "Hello World со странными' символами \ * [ >

Что такое sh ? Что такое sys-snap.sh ? Почему я должен поставить & в конце строки? Кто-нибудь может объяснить синтаксис?

Без этого & скрипт не вернется к подсказке, пока я не нажму Ctrl + C . С помощью & я могу нажать Enter, и это работает.

отличается ли двойной амперсанд && от одного амперсанда & ? @CharlieParker Вы когда-нибудь находили ответ на это? Я пытаюсь выяснить разницу сам. (Edit: Nevermind, нашел его еще ниже)

sh это Bourne-совместимая оболочка по умолчанию (обычно bash или dash)

С & процессом запускается в фоновом режиме, так что вы можете продолжать использовать оболочку и не нужно ждать , пока сценарий не будет завершен. Если вы забудете об этом, вы можете остановить текущий запущенный процесс с помощью Ctrl-Z и продолжить его в фоновом режиме с помощью bg (или на переднем плане с помощью fg ). Для получения дополнительной информации см. Контроль работы

sh обычно только bash или dash в системах на основе Linux (или в последних OS / X). На BSD это обычно другой вариант Ash (dash основан на NetBSD sh, сам по себе основанный на Almquist Shell) или производная pdksh. На коммерческих Unices это вообще ksh88. @jofel: Что, если приведенный ниже скрипт запущен и по ошибке я выполнил Ctrl-C. Мой сценарий будет выполнен, или он будет прекращен? Пример: sh sys-snap.sh & @ Hussain7 Ctrl-C всегда отправляется текущему процессу на переднем плане. Если shell-скрипт запускается & и, следовательно, в фоновом режиме, вы получаете только новое приглашение оболочки. отличается ли двойной амперсанд && от одного амперсанда & ? @CharlieParker Да, "&&" - это функция "и". Команда после && вызывается только тогда, когда команда до этого успешно выполняется. Пример «true && echo works» «output» работает, но «false && echo no output» не вызывает функцию echo.

Это известно как job control под Unix. & Информирует скорлупу поставить команду в фоновом режиме. Это означает, что он продолжает выполнять sys-snap.sh команду, но возвращает вас в вашу оболочку, чтобы вы могли продолжать выполнять параллельные команды.

Вы можете увидеть список заданий, которые в данный момент выполняются с помощью jobs команды. Вы можете вернуться к команде (вывести на передний план) с помощью fg команды. Который тянет команду обратно в состояние, в котором вы не видите подсказки и вам нужно выдать команду Ctrl - C чтобы убить процесс. Однако вы можете приостановить (приостановить) этот процесс, выдав Ctrl - Z . Это приостановит sys-snap.sh и вернет вас к вашему приглашению. Вы можете затем фон это (как будто вы издавали его с & ) с bg командой, и он будет возобновить работы от его состояния паузы в Ctrl - Z поставил его.

Обратите внимание, что вы можете иметь более одной работы одновременно (как показано jobs ):

Вы можете фон и их передний план, используя их номер работы, %1 будет sys-snap.sh и %2 будет another-script.sh . Если вы используете аргументы fg или bg не используете их, она будет выполнять команду для задания, помеченного + в jobs выходных данных выше.

поставит sys-snap.sh обратно на первый план, в то время оставляя another-script.sh на заднем плане.

Вы можете выполнить последовательность Ctrl - C для запущенных заданий без необходимости выделять их перед kill командой с помощью команды, kill %1 отправит эквивалент Ctrl - C to sys-snap.sh .

Если вы используете оболочку bash, man bash команда имеет подробный раздел под разделом «УПРАВЛЕНИЕ ЗАДАНИЯМИ», в котором более подробно.

Что касается имени sys-snap.sh , в Unix имена файлов являются произвольными (с парой исключений, таких как файлы динамического загрузчика). Для них не требуется наличие определенных расширений файлов, чтобы они запускались как сценарий оболочки, вызывали другие команды, такие как perl и php т. Д. Обычно это используется для ясности, что в данном случае это .sh сценарий оболочки, использующий оболочку Борна /bin/sh ,

Функциональная часть sys-snap.sh (когда вы смотрите на ее содержимое с помощью less команды) - это Шебанг . В первой строке вы, вероятно, найдете одно из:

или если вы запустили его по явному пути ./sys-snap.sh ( . имеется в виду текущий рабочий каталог), вы получите:

Другой вариант - оставить его без прав на выполнение и явно попросить / bin / sh запустить его:

Немного обо всем и все о немногом, или практический опыт системного администратора.

Ноябрь 2009
Пн Вт Ср Чт Пт Сб Вс
« Окт Дек »
1
2345678
9101112131415
16171819202122
23242526272829
30

Лекция №14 - Процессы, задачи. Команды fg, bg, jobs, top, nohup

Calendar

13 ноября 2009, 19:14

Запущенные из консоли с помощью амперсанда команды, работают в фоновом режиме и называются задачами (jobs). Можно сказать, что задачи это процессы, привязанные к командному интерпретатору. Такие задачи помимо традиционного PID имеют еще свою нумерацию начинающуюся с единицы. Просмотреть запущенные задачи интерпретатора, можно командой jobs. В примере ниже показана ситуация когда есть две задачи и выполнение одного из них остановлено.

Отметьте для себя также, что задачи имеют свою нумерацию для каждого терминала (консоли). Если вы зарегистрируетесь в другой консоли и запустите в фоновом режиме процесс, то номер задачи будет начинаться с единицы. Также вы не найдете справки по командам fg и bg (man fg, man bg). Потому, что эти команды являются частью bash. И упоминание о них вы найдете в man bash.

Любые процессы запущенные из командного интерпретатора являются дочерними для него. И PPID таких процессов будет равен PID соответствующего командного интерпретатора. Если выйти из командного интерпретатора, то все процессы запущенные из него (в том числе и находящиеся в фоновом режиме) будут завершены. Зарегистрируйтесь в двух консолях и запустите во второй несколько процессов, перейдите в первую и выполните команду ps al:

$ ps al
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 13180 1053 20 0 6292 3552 wait Ss pts/0 0:00 bash
0 1000 16442 1054 20 0 6292 3560 wait Ss pts/1 0:00 bash
0 1000 16460 16442 20 0 2952 628 signal T pts/1 0:00 sleep 200
0 1000 16461 16442 20 0 18416 4392 signal T pts/1 0:00 mocp
0 1000 16469 16442 20 0 2952 628 hrtime S pts/1 0:00 sleep 1000
0 1000 16470 16442 20 0 2468 1208 poll_s S+ pts/1 0:00 top
0 1000 16473 13180 20 0 2424 828 - R+ pts/0 0:00 ps al

В примере у нас запущено два командных интерпретатора bash с PID равными 13180 и 16442. Далее идут 4-е процесса, которые были запущены из второго командного интерпретатора - их можно определить по PPID равному 16442. Теперь выйдите (команда exit) из второго интерпретатора и снова выполните команду ps al в первом интерпретаторе:

$ ps al
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 13180 1053 20 0 6292 3556 wait Ss pts/0 0:00 bash
0 1000 16679 13180 20 0 2424 824 - R+ pts/0 0:00 ps al

Как видим завершился не только процесс с PID 16442, но и все процессы потомки (PPID 16442). Еще одно подтверждение того, что процесс-потомок не может существовать без родительского процесса.

Но, что делать если необходимо запустить процесс, и выйти из консоли так чтобы процесс продолжал работать в системе? Выход один - передать процесс-потомок другому процессу, который будет для него родительским. Такая возможность реализована в команде nohup. Данная команда позволяет запускать процессы, который будут оторваны от терминала если, терминал будет закрыт. Проводим эксперимент. Запускаем любую команду (например ping) через nohup в одной консоли и не выходя из нее смотрим на процессы:

$ ps alx
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 17326 1 20 0 7908 3208 wait Ss tty2 0:00 /bin/login --
4 1000 17427 17326 20 0 6304 3560 wait S tty2 0:00 -bash
4 1000 17450 17427 20 0 1848 556 wait_f S tty2 0:00 ping 127.0.0.1
0 1000 17517 13180 20 0 2424 848 - R+ pts/0 0:00 ps alx

Видим, что сейчас процесс ping имеют PPID равный 17427 (то есть это потомок командного интерпретатора bash) и PID 17450. Теперь выйдем из командного интерпретатора bash с PID 17427 и снова посмотрим на процессы:

$ ps alx
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 1000 17450 1 20 0 1848 556 poll_s S ? 0:00 ping 127.0.0.1

Как видим несмотря на то, что мы вышли из командного интерпретатора, процесс с PID 17450 остался в системе и принял в качестве родительского, процесс с PID равным 1, то есть процесс init. Процесс 17450 будет существовать до тех пор пока будет существовать процесс init, или пока мы сами не завершим его работу с помощью команды kill.

Команда ps показывает очень подробную информацию о процессах, но она почти бесполезна если нужно отследить работу процесса в реальном времени, просмотреть какие ресурсы и в каком количестве занимает процесс. Для этого существует другая команда - top. Команда top работает в интерактивном режиме и в режиме реального времени отображает работу процессов. Чтобы запустить нужно просто набрать команду - top. Выход - клавиша q. Процессы отображены не все, а только верхняя часть таблицы процессов отсортированная по какому-либо критерию (столбцу). Информацию которую выводит команда top можно условно разбить на две части: верхнюю с общей информацией о системе и ресурсах, и нижнюю таблицу процессов. В верхней части можно увидеть информацию о том сколько дней работает система, сколько занято оперативной памяти, сколько запущено процессов и другая информация:

top - 17:09:05 up 2 days, 1:48, 6 users, load average: 0.08, 0.05, 0.04
Tasks: 189 total, 1 running, 188 sleeping, 0 stopped, 0 zombie
Cpu(s): 4.7%us, 1.5%sy, 0.0%ni, 93.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1024756k total, 785880k used, 238876k free, 16372k buffers
Swap: 1140544k total, 287012k used, 853532k free, 365048k cached

По умолчанию процессы отсортированы по уровню загрузки процессора. Если необходимо изменить порядок сортировки, нужно нажать комбинацию клавиш Shift+o или Shift+f. После нажатия этой комбинации клавиш будет отображено окно в котором можно выбрать столбец по которому необходимо отсортировать таблицу. Например, чтобы отсортировать таблицу по объему занимаемой памяти нужно нажать комбинацию Shift+o, затем клавишу n и нажать Enter. Чтобы изменить порядок сортировки (убывание/возрастание), необходимо нажимать комбинацию Shift+r.

Чтобы получить краткую справку о программе top нужно нажать клавишу h.

Чтобы отобразить процессы определенного пользователя необходимо в работающей программе top нажать клавишу u и затем набрать имя учетной записи и нажать Enter. Чтобы снова отобразить все процессы нажимаем u и ничего не набирая нажимаем Enter.

Очень удобно программу top использовать для удаления процессов которые загружают систему. Такие процессы (загружающие процессор на 100%) будут по умолчанию вверху таблицы. Смотрим PID процесса, нажимаем клавишу k, пишем PID и нажимаем Enter. Затем пишем номер сигнала 9 и еще раз Enter.

У команды top еще много возможностей, подробнее смотрите в справке. На этом будем заканчивать тему процессов и сигналов. Следующая лекция будет посвящена монтированию файловых систем.

Читайте также: