Получите клиентов в любой нише!
Делегируйте запуск рекламы нам — бесплатно
Подробнее
21.0
LinuxCamp | Кирилл Жильников
2
Поделиться
В избранное
Купить рекламу в этом канале
Формат:
keyboard_arrow_down
- 1/24
- 2/48
- 3/72
- Нативный
- 7 дней
- Репост
1 час в топе / 24 часа в ленте
Количество:
%keyboard_arrow_down
- 1
- 2
- 3
- 4
- 5
- 8
- 10
- 15
Стоимость публикации:
local_activity
8 391.60₽8 391.60₽local_mall
0.0%
Последние посты канала
Проблема с вводом-выводом в фоновом выполнении
Фоновая команда может использовать стандартный вывод, когда это совершенно не к месту)
Что будет, если вы, например, отсортируете немалый файл и запросите вывод двух первых строк в фоновом режиме?
Вначале оболочка напечатает номер задания (1), идентификатор процесса (81089) и приглашение к вводу:
На данном этапе происходит сортировка данных и подготовка вывода. Когда первая часть задания завершится, отработает команда "head -n2" и выведутся две строки (где бы курсор не находился):
Вывод на экран при выполнении фонового задания может появиться в любое время. Ладно, если там пару строк, а вдруг данные выводятся регулярно и в большом объеме...
Совет: чтобы избежать беспорядка, перенаправьте stdout в файл, а затем просмотрите его, когда вам будет удобно:
Неожиданности случаются и тогда, когда фоновое задание пытается читать со стандартного ввода. Оболочка приостанавливает задание, печатает сообщение Stopped и ожидает ввода. Запустив команду cat в фоновом режиме без аргументов, чтобы она читала STDIN:
Задания не могут читать ввод в фоновом режиме, поэтому сначала переведем его на передний план с помощью fg, а затем введем данные:
После ввода можно уже либо завершить задачу "Ctrl + C", либо вернуть ее в фон через "Ctrl + Z" и bg.
Linux++ | IT-Образование
Фоновая команда может использовать стандартный вывод, когда это совершенно не к месту)
Что будет, если вы, например, отсортируете немалый файл и запросите вывод двух первых строк в фоновом режиме?
Вначале оболочка напечатает номер задания (1), идентификатор процесса (81089) и приглашение к вводу:
$ sort /usr/share/dict/words | head -n2 &
[1] 81089
$
На данном этапе происходит сортировка данных и подготовка вывода. Когда первая часть задания завершится, отработает команда "head -n2" и выведутся две строки (где бы курсор не находился):
$ sort /usr/share/dict/words | head -n2 &
[1] 81089
$A
A's
Вывод на экран при выполнении фонового задания может появиться в любое время. Ладно, если там пару строк, а вдруг данные выводятся регулярно и в большом объеме...
Совет: чтобы избежать беспорядка, перенаправьте stdout в файл, а затем просмотрите его, когда вам будет удобно:
$ sort /usr/share/dict/words | head -n2 > /tmp/results &
$ cat /tmp/results
A
A's
Неожиданности случаются и тогда, когда фоновое задание пытается читать со стандартного ввода. Оболочка приостанавливает задание, печатает сообщение Stopped и ожидает ввода. Запустив команду cat в фоновом режиме без аргументов, чтобы она читала STDIN:
$ cat &
[1] 82455
[1]+ Stopped cat
Задания не могут читать ввод в фоновом режиме, поэтому сначала переведем его на передний план с помощью fg, а затем введем данные:
$ fg
cat
Hello world!
Hello world!
После ввода можно уже либо завершить задачу "Ctrl + C", либо вернуть ее в фон через "Ctrl + Z" и bg.
Linux++ | IT-Образование
1500
06:42
09.01.2025
imageИзображение не доступно для предпросмотра
Команды управления заданиями
В прошлый раз мы узнали о фоновом выполнении команд и дали определение термину "задание".
Сегодня рассмотрим, встроенные в оболочку средства, которые позволяют управлять заданиями: bg, fg, jobs, kill.
Давайте для начала запустим в фоне несколько команд sleep, которые ничего не будет делать в течение заданного времени:
Чтобы выяснить, за какими заданиями следит оболочка, используется команда jobs:
[1] - номер задания, который используется для идентификации. Полезен, когда необходимо "ткнуть пальцем" в определенный элемент, используя: fg, bg, kill;
"" (отсутствие знака) - обозначает то, что задание не является ни текущим ни предыдущим, но находится в списке.
"+" указывает на текущее задание, по отношению к которому будут выполнены команды, если не указывать номер. "-" указывает на предыдущее задание;
Running - статус задачи. Также возможны: Stopped, Done, Terminated, Killed. Статусы могут меняться в ответ на отправленный сигнал (SIGKILL, SIGSTOP и т.д.);
Теперь выведем второе задание на передний план. Для этого будем использовать команду fg с указанием номера:
Если в параметры ничего не вносить, команда выполнится для последнего задания (со знаком +).
Для того, чтобы перенести выполнение в фон и не блокировать терминал, используется bg.
Для примера запустим задание переднего плана, остановим его выполнение "Ctrl + Z" и отправим его в фоновый режим:
К целевому заданию также можно обратиться по номеру:
С заданиями "kill %n" можно использовать для принудительного завершения:
По умолчанию отправляется сигнал SIGTERM, при желании, можно указать любой другой:
Linux++ | IT-Образование
В прошлый раз мы узнали о фоновом выполнении команд и дали определение термину "задание".
Сегодня рассмотрим, встроенные в оболочку средства, которые позволяют управлять заданиями: bg, fg, jobs, kill.
Давайте для начала запустим в фоне несколько команд sleep, которые ничего не будет делать в течение заданного времени:
$ sleep 10 & sleep 20 & sleep 30 &
Чтобы выяснить, за какими заданиями следит оболочка, используется команда jobs:
$ jobs
[1] Running sleep 10 &
[2]- Running sleep 20 &
[3]+ Running sleep 30 &
[1] - номер задания, который используется для идентификации. Полезен, когда необходимо "ткнуть пальцем" в определенный элемент, используя: fg, bg, kill;
"" (отсутствие знака) - обозначает то, что задание не является ни текущим ни предыдущим, но находится в списке.
"+" указывает на текущее задание, по отношению к которому будут выполнены команды, если не указывать номер. "-" указывает на предыдущее задание;
Running - статус задачи. Также возможны: Stopped, Done, Terminated, Killed. Статусы могут меняться в ответ на отправленный сигнал (SIGKILL, SIGSTOP и т.д.);
Теперь выведем второе задание на передний план. Для этого будем использовать команду fg с указанием номера:
$ fg %2
sleep 20
Если в параметры ничего не вносить, команда выполнится для последнего задания (со знаком +).
Для того, чтобы перенести выполнение в фон и не блокировать терминал, используется bg.
Для примера запустим задание переднего плана, остановим его выполнение "Ctrl + Z" и отправим его в фоновый режим:
$ nm-applet
^Z
[1]+ Stopped nm-applet
$ bg
[1]+ nm-applet &
$ jobs
[1]+ Running nm-applet
К целевому заданию также можно обратиться по номеру:
$ jobs
[1]- Stopped sleep 200
[2]+ Running sleep 100 &
$ bg %1
[1]+ sleep 200 &
С заданиями "kill %n" можно использовать для принудительного завершения:
$ kill %1
[1]+ Terminated sleep 200
По умолчанию отправляется сигнал SIGTERM, при желании, можно указать любой другой:
$ kill -9 %1
[1]+ Killed sleep 200
Linux++ | IT-Образование
2400
07:42
06.01.2025
imageИзображение не доступно для предпросмотра
Введение в фоновые команды и задания
Стандартное выполнение команды в оболочке происходит так, что вам требуется ожидать ее завершения для дальнейшего взаимодействия с командной строкой.
Это обычно неэффективно, когда выполнение занимает время и вам не требуется общаться с утилитой через CLI либо отлаживать ее логи.
Не беда, вы можете запускать команды особым образом, чтобы они исчезали из поля зрения, но продолжали выполняться, освобождая текущую оболочку.
Этот метод называется фоновым выполнением команды (backgrounding).
Если же команда занимает оболочку, ее называют командой переднего плана (foreground).
Запуск команды в фоновом режиме
Чтобы запуститься в фоновом режиме, просто добавьте амперсанд "&" после команды:
[1] - номер, под которым закрепилось задание (job);
74931 - PID процесса;
Если команда завершится успешно, оболочка выведет сообщение:
Если где-то произошла ошибка и команда завершилась аварийно, вы увидите сообщение о выходе с кодом возврата:
Амперсанд "&" является оператором списка - вы можете вывести в фон сразу ряд команд:
Чем является задание?
Вы можете подумать, что под заданием подразумевается 1 процесс - немного не так.
Задание — это единица работы оболочки. Простые команды, конвейеры и условные списки — примеры заданий, которые можно запускать из командной строки.
Задание — это больше, чем просто процесс Linux. Задание может состоять из одного или нескольких процессов:
Например, конвейер из шести программ представляет собой одно задание, включающее 6 процессов:
В оболочке может быть запущено одновременно несколько заданий, каждый экземпляр имеет свой ID.
Linux++ | IT-Образование
Стандартное выполнение команды в оболочке происходит так, что вам требуется ожидать ее завершения для дальнейшего взаимодействия с командной строкой.
Это обычно неэффективно, когда выполнение занимает время и вам не требуется общаться с утилитой через CLI либо отлаживать ее логи.
Не беда, вы можете запускать команды особым образом, чтобы они исчезали из поля зрения, но продолжали выполняться, освобождая текущую оболочку.
Этот метод называется фоновым выполнением команды (backgrounding).
Если же команда занимает оболочку, ее называют командой переднего плана (foreground).
Запуск команды в фоновом режиме
Чтобы запуститься в фоновом режиме, просто добавьте амперсанд "&" после команды:
$ wc -c file.txt &
[1] 74931
$
[1] - номер, под которым закрепилось задание (job);
74931 - PID процесса;
Если команда завершится успешно, оболочка выведет сообщение:
[1]+ Done wc -c file.txt
Если где-то произошла ошибка и команда завершилась аварийно, вы увидите сообщение о выходе с кодом возврата:
[1]+ Exit 1 wc -c file.txt
Амперсанд "&" является оператором списка - вы можете вывести в фон сразу ряд команд:
$ nm-applet & wc -c file.txt &
[1] 28839
[2] 28840
Чем является задание?
Вы можете подумать, что под заданием подразумевается 1 процесс - немного не так.
Задание — это единица работы оболочки. Простые команды, конвейеры и условные списки — примеры заданий, которые можно запускать из командной строки.
Задание — это больше, чем просто процесс Linux. Задание может состоять из одного или нескольких процессов:
[4]+ Running nm-applet && wc -c file.txt &
Например, конвейер из шести программ представляет собой одно задание, включающее 6 процессов:
$ cat file.txt | grep "word" | sort | uniq | tr 'a-z' 'A-Z' | wc -l > result.txt &
[5]+ Running cat file.txt | grep --color=auto "word" ... &
В оболочке может быть запущено одновременно несколько заданий, каждый экземпляр имеет свой ID.
Linux++ | IT-Образование
3200
10:11
03.01.2025
imageИзображение не доступно для предпросмотра
Я долго не мог найти, где собираются топовые IT-спецы и делятся своим опытом
Спасибо коллеге, что подсказал канал IT-мероприятия России. Теперь знаю, как провести свободное время и найти комьюнити по интересам!
Это канал для тех, кто хочет не только просиживать за работой, в свободное время залипая на Ютубе.
Там собрано огромное количество самых интересных событий в сфере IT для тех, кто реально хочет развиваться и стать лучшим.
📍 Анонсы форумов, конференций, митапов, вебинаров, хакатонов, олимпиад - рекомендую подписаться сразу, чтобы не потерять!
IT-мероприятия России / ITMeeting / IT events
Спасибо коллеге, что подсказал канал IT-мероприятия России. Теперь знаю, как провести свободное время и найти комьюнити по интересам!
Это канал для тех, кто хочет не только просиживать за работой, в свободное время залипая на Ютубе.
Там собрано огромное количество самых интересных событий в сфере IT для тех, кто реально хочет развиваться и стать лучшим.
📍 Анонсы форумов, конференций, митапов, вебинаров, хакатонов, олимпиад - рекомендую подписаться сразу, чтобы не потерять!
IT-мероприятия России / ITMeeting / IT events
2200
07:11
03.01.2025
imageИзображение не доступно для предпросмотра
Подстановка вывода команды: $()
Оператор, который мы сегодня рассмотрим является супер полезной фичей оболочки. Мы буквально можем подставить вывод команды либо целой цепочки посреди выражения.
Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:
Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:
Затем переместить каждый файл в необходимый каталог:
Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».
Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:
Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.
Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:
В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:
Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:
Выдаем права на выполнение, запускаем и проверяем:
Linux++ | IT-Образование
Оператор, который мы сегодня рассмотрим является супер полезной фичей оболочки. Мы буквально можем подставить вывод команды либо целой цепочки посреди выражения.
Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:
Название: Зеркала
Исполнитель: Лепс
Острые углы, нервы, суета
Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:
$ grep -l "Лепс" *.txt
song1.txt
song2.txt
Затем переместить каждый файл в необходимый каталог:
$ mkdir leps
$ mv song1.txt leps
$ mv song2.txt leps
Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».
Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:
$ mv $(grep -l "Лепс" *.txt) leps
Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.
Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:
$ mv song1.txt song2.txt leps
В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:
переменная=$(команда)
Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:
status=$(ls ./ 2>/dev/null | wc -l)
if [ "$status" -gt 0 ]; then
echo "В директории есть $status файлов"
else
echo "Директория пуста или не существует"
fi
Выдаем права на выполнение, запускаем и проверяем:
$ chmod +x script.sh
$ ./script.sh
В директории есть 66 файлов
Linux++ | IT-Образование
3600
08:06
01.01.2025
imageИзображение не доступно для предпросмотра
Подстановка вывода команды: $()
Оператор, который мы сегодня рассмотрим является супер полезной фичей оболочки. Мы буквально можем подставить вывод команды либо целой цепочки посреди выражения.
Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:
Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:
Затем переместить каждый файл в необходимый каталог:
Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».
Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:
Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.
Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:
В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:
Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:
Выдаем права на выполнение, запускаем и проверяем:
Для чего бывает полезно брать "$()" в кавычки?
Есть несколько основных кейсов, когда следует использовать "$()" вместо $().
Во-первых, если вывод команды содержит пробелы, он будет разбит на отдельные слова.
Представим, что стоит задача определить для текущей директории специальные права.
Есть момент - имя каталога состоит из нескольких слов, разделенных пробелами "photo and video":
После подстановки оболочка интерпретирует это как попытку применить chmod к трём разным объектам: "/home/xoadmin/photo", "and", и "video". Это, вероятно, приведёт к ошибке:
Чтобы вывод pwd воспринимался, как единое целое, следует заключить оператор в кавычки:
Во-вторых, без кавычек, символы перевода строки могут быть удалены при выводе через echo:
Если требуется сохранить четкую структуру текста, содержащего символы переноса, следует использовать "$()":
Linux++ | IT-Образование
Оператор, который мы сегодня рассмотрим является супер полезной фичей оболочки. Мы буквально можем подставить вывод команды либо целой цепочки посреди выражения.
Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:
Название: Зеркала
Исполнитель: Лепс
Острые углы, нервы, суета
Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:
$ grep -l "Лепс" *.txt
song1.txt
song2.txt
Затем переместить каждый файл в необходимый каталог:
$ mkdir leps
$ mv song1.txt leps
$ mv song2.txt leps
Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».
Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:
$ mv $(grep -l "Лепс" *.txt) leps
Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.
Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:
$ mv song1.txt song2.txt leps
В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:
переменная=$(команда)
Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:
status=$(ls ./ 2>/dev/null | wc -l)
if [ "$status" -gt 0 ]; then
echo "В директории есть $status файлов"
else
echo "Директория пуста или не существует"
fi
Выдаем права на выполнение, запускаем и проверяем:
$ chmod +x script.sh
$ ./script.sh
В директории есть 66 файлов
Для чего бывает полезно брать "$()" в кавычки?
Есть несколько основных кейсов, когда следует использовать "$()" вместо $().
Во-первых, если вывод команды содержит пробелы, он будет разбит на отдельные слова.
Представим, что стоит задача определить для текущей директории специальные права.
Есть момент - имя каталога состоит из нескольких слов, разделенных пробелами "photo and video":
$ pwd
$ /home/xoadmin/photo and video
$ chmod 777 $(pwd)
После подстановки оболочка интерпретирует это как попытку применить chmod к трём разным объектам: "/home/xoadmin/photo", "and", и "video". Это, вероятно, приведёт к ошибке:
chmod: cannot access '/home/xoadmin/photo': No such file or directory
chmod: cannot access 'and': No such file or directory
chmod: cannot access 'video': No such file or directory
Чтобы вывод pwd воспринимался, как единое целое, следует заключить оператор в кавычки:
$ chmod 777 "$(pwd)"
Во-вторых, без кавычек, символы перевода строки могут быть удалены при выводе через echo:
$ echo $(ls)
adduser.conf alsa alternatives apache2 apg.conf apparmor
Если требуется сохранить четкую структуру текста, содержащего символы переноса, следует использовать "$()":
$ echo "$(ls)"
adduser.conf
alsa
alternatives
Linux++ | IT-Образование
3600
08:06
01.01.2025
imageИзображение не доступно для предпросмотра
Подстановка вывода команды: $()
Оператор, который мы сегодня рассмотрим является супер полезной фичей оболочки. Мы буквально можем подставить вывод команды либо целой цепочки посреди выражения.
Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:
Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:
Затем переместить каждый файл в необходимый каталог:
Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».
Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:
Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.
Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:
В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:
Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:
Выдаем права на выполнение, запускаем и проверяем:
Для чего бывает полезно брать "$()" в кавычки?
Есть несколько основных кейсов, когда следует использовать "$()" вместо $().
Во-первых, если вывод команды содержит пробелы, он будет разбит на отдельные слова.
Представим, что стоит задача определить для текущей директории специальные права.
Есть момент - имя каталога состоит из нескольких слов, разделенных пробелами "photo and video":
После подстановки оболочка интерпретирует это как попытку применить chmod к трём разным объектам: "/home/xoadmin/photo", "and", и "video". Это, вероятно, приведёт к ошибке:
Чтобы вывод pwd воспринимался, как единое целое, следует заключить оператор в кавычки:
Во-вторых, без кавычек, символы перевода строки могут быть удалены при выводе через echo:
Если требуется сохранить четкую структуру текста, содержащего спец символы, следует использовать "$()":
Linux++ | IT-Образование
Оператор, который мы сегодня рассмотрим является супер полезной фичей оболочки. Мы буквально можем подставить вывод команды либо целой цепочки посреди выражения.
Предположим, у вас есть несколько тысяч текстовых файлов c песнями. Каждый файл содержит название песни, ее текст и имя исполнителя:
Название: Зеркала
Исполнитель: Лепс
Острые углы, нервы, суета
Стоит задача распределить файлы в подкаталоги по исполнителям. Ну, для начала, можно найти все файлы песен исполнителя с помощью grep:
$ grep -l "Лепс" *.txt
song1.txt
song2.txt
Затем переместить каждый файл в необходимый каталог:
$ mkdir leps
$ mv song1.txt leps
$ mv song2.txt leps
Чет неудобно, так? Было бы неплохо сказать оболочке: «Перемести все файлы, содержащие строку Лепс, в каталог leps».
Для этого нужно забрать то, что нам выдала команда "grep -l" и передать результат в качестве списка аргументов для mv:
$ mv $(grep -l "Лепс" *.txt) leps
Синтаксис "$(команда)" выполняет выражение в круглых скобках и заменяет вставку его выводом.
Таким образом, "grep -l" подменяется, подходящими под условие именнами файлов. Результат использования $() в примере выше аналогичен:
$ mv song1.txt song2.txt leps
В сценариях оболочки подстановка бывает полезна для сохранения вывода команды в переменной:
переменная=$(команда)
Например, напишем простенький скрипт, который поможет нам узнать, содержит ли текущая директория файлы:
status=$(ls ./ 2>/dev/null | wc -l)
if [ "$status" -gt 0 ]; then
echo "В директории есть $status файлов"
else
echo "Директория пуста или не существует"
fi
Выдаем права на выполнение, запускаем и проверяем:
$ chmod +x script.sh
$ ./script.sh
В директории есть 66 файлов
Для чего бывает полезно брать "$()" в кавычки?
Есть несколько основных кейсов, когда следует использовать "$()" вместо $().
Во-первых, если вывод команды содержит пробелы, он будет разбит на отдельные слова.
Представим, что стоит задача определить для текущей директории специальные права.
Есть момент - имя каталога состоит из нескольких слов, разделенных пробелами "photo and video":
$ pwd
$ /home/xoadmin/photo and video
$ chmod 777 $(pwd)
После подстановки оболочка интерпретирует это как попытку применить chmod к трём разным объектам: "/home/xoadmin/photo", "and", и "video". Это, вероятно, приведёт к ошибке:
chmod: cannot access '/home/xoadmin/photo': No such file or directory
chmod: cannot access 'and': No such file or directory
chmod: cannot access 'video': No such file or directory
Чтобы вывод pwd воспринимался, как единое целое, следует заключить оператор в кавычки:
$ chmod 777 "$(pwd)"
Во-вторых, без кавычек, символы перевода строки могут быть удалены при выводе через echo:
$ echo $(ls)
adduser.conf alsa alternatives apache2 apg.conf apparmor
Если требуется сохранить четкую структуру текста, содержащего спец символы, следует использовать "$()":
$ echo "$(ls)"
adduser.conf
alsa
alternatives
Linux++ | IT-Образование
3600
08:06
01.01.2025
Что за праздник на пороге?) Новый год 🔴
Ну вот, пишу завершающий пост в 2024 году, давайте подведем небольшие итоги и чуть побеседуем.
Много было проделано работы, мы набрали больше 7к человек, среди которых как устоявшиеся спецы, так и новички, которым только предстоит окунуться в мир разработки и администрирования.
Представляете, 7к! Я, честно говоря, думал, и до 5 с трудом доковыляем. Но как-то все пошло-поехало и получилось зафиксировать хороший результат. Очень рад, что в этом году все-таки получилось начать движение в сторону публичной деятельности. Мы держим в уме - все только начинается!
Хочу каждому выразить огромную благодарность за то, что остаетесь на связи, читаете и комментируете публикации. Радует, что держатся и олды, которые на канале с самого его зачатия. Они помнят те бесконечные посты про динамические библиотеки))
Вам хочу пожелать крепкого здоровья, профессиональной реализации, огня в глазах, успехов в достижении поставленных целей и положительных перемен. Все у вас получится!
Также искренне желаю, чтобы вас окружали правильные люди, которые будут помогать держать верный курс. Наше окружение оказывает значительное влияние на то, кто мы есть и кем будем. Работайте над ним, иногда рефлексируйте и, при необходимости, вносите коррективы)
На этом прощаюсь, с наступающим праздником!
Ну вот, пишу завершающий пост в 2024 году, давайте подведем небольшие итоги и чуть побеседуем.
Много было проделано работы, мы набрали больше 7к человек, среди которых как устоявшиеся спецы, так и новички, которым только предстоит окунуться в мир разработки и администрирования.
Представляете, 7к! Я, честно говоря, думал, и до 5 с трудом доковыляем. Но как-то все пошло-поехало и получилось зафиксировать хороший результат. Очень рад, что в этом году все-таки получилось начать движение в сторону публичной деятельности. Мы держим в уме - все только начинается!
Хочу каждому выразить огромную благодарность за то, что остаетесь на связи, читаете и комментируете публикации. Радует, что держатся и олды, которые на канале с самого его зачатия. Они помнят те бесконечные посты про динамические библиотеки))
Вам хочу пожелать крепкого здоровья, профессиональной реализации, огня в глазах, успехов в достижении поставленных целей и положительных перемен. Все у вас получится!
Также искренне желаю, чтобы вас окружали правильные люди, которые будут помогать держать верный курс. Наше окружение оказывает значительное влияние на то, кто мы есть и кем будем. Работайте над ним, иногда рефлексируйте и, при необходимости, вносите коррективы)
На этом прощаюсь, с наступающим праздником!
3200
19:02
31.12.2024
imageИзображение не доступно для предпросмотра
Выполняй только то, что нужно! Условные списки Bash
Скорее всего, вы каждый день запускаете команды, которые зависят от выполнения предыдущих.
Механизм списков позволяет не только разом выполнить группу команд, но и выстроить условную последовательность через операторы "&& (И)" и "|| (ИЛИ)".
Условные списки
Предположим, вы хотите создать файл new.txt в каталоге dir. Типичная последовательность может быть следующей:
Запуск второй команды зависит от успешного выполнения первой. Если каталог не существует, то нет смысла и команду запускать.
Оболочка позволяет сделать эту зависимость явной, объединив команды оператором && (И):
Если вы используете систему контроля версий Git, то, вероятно, знакомы со следующей последовательностью команд фиксации и внесения изменений:
Если какая-либо из команд завершится ошибкой, остальные вы не запустите. Поэтому эта цепочка хорошо работает в формате условного списка.
Так же, как оператор && запускает вторую команду только в случае успеха первой, оператор || (ИЛИ) запускает вторую команду только в случае сбоя первой.
Например, следующая команда пытается войти в каталог и, если это не удается, создает его:
Вы часто будете видеть этот оператор в сценариях оболочки. В частности, для выхода в случае возникновения ошибки:
Операторы && и || можно использовать вместе, чтобы настраивать более сложные действия:
Последовательность предполагает попытку войти в каталог dir, если это не удается, создать каталог и войти в него, а если и это не удается, вывести ошибку.
Безусловные списки
Команды в списке не обязательно должны зависеть друг от друга. Если вы разделяете команды точкой с запятой, они просто выполняются по порядку.
Вот пример команды, которая спит течение двух часов, а затем создает резервную копию важных файлов:
Безусловные списки дают те же результаты, что и ввод команд по отдельности.
Единственное существенное различие - коды возврата. В таком списке коды отдельных команд отбрасываются, кроме последней.
Только код возврата последней команды в списке присваивается переменной оболочки "?":
Linux++ | IT-Образование
Скорее всего, вы каждый день запускаете команды, которые зависят от выполнения предыдущих.
Механизм списков позволяет не только разом выполнить группу команд, но и выстроить условную последовательность через операторы "&& (И)" и "|| (ИЛИ)".
Условные списки
Предположим, вы хотите создать файл new.txt в каталоге dir. Типичная последовательность может быть следующей:
$ cd dir
$ touch new.txt
Запуск второй команды зависит от успешного выполнения первой. Если каталог не существует, то нет смысла и команду запускать.
Оболочка позволяет сделать эту зависимость явной, объединив команды оператором && (И):
$ cd dir && touch new.txt
Если вы используете систему контроля версий Git, то, вероятно, знакомы со следующей последовательностью команд фиксации и внесения изменений:
$ git add . && git commit -m"fixed a bug" && git push
Если какая-либо из команд завершится ошибкой, остальные вы не запустите. Поэтому эта цепочка хорошо работает в формате условного списка.
Так же, как оператор && запускает вторую команду только в случае успеха первой, оператор || (ИЛИ) запускает вторую команду только в случае сбоя первой.
Например, следующая команда пытается войти в каталог и, если это не удается, создает его:
$ cd dir || mkdir dir
Вы часто будете видеть этот оператор в сценариях оболочки. В частности, для выхода в случае возникновения ошибки:
cd dir || exit 1
Операторы && и || можно использовать вместе, чтобы настраивать более сложные действия:
$ cd dir || mkdir dir && cd dir || echo "I failed"
Последовательность предполагает попытку войти в каталог dir, если это не удается, создать каталог и войти в него, а если и это не удается, вывести ошибку.
Безусловные списки
Команды в списке не обязательно должны зависеть друг от друга. Если вы разделяете команды точкой с запятой, они просто выполняются по порядку.
Вот пример команды, которая спит течение двух часов, а затем создает резервную копию важных файлов:
$ sleep 7200; cp -a ~/files /mnt/backup_drive
Безусловные списки дают те же результаты, что и ввод команд по отдельности.
Единственное существенное различие - коды возврата. В таком списке коды отдельных команд отбрасываются, кроме последней.
Только код возврата последней команды в списке присваивается переменной оболочки "?":
$ mv file1 file2; mv file2 file3; mv file3 file4
# Код возврата команды «mv file3 file4»
$ echo $?
0
Linux++ | IT-Образование
3700
06:47
30.12.2024
imageИзображение не доступно для предпросмотра
Вычисление переменных и развеивание заблуждений
Мы с вами уже как-то говорили про суть переменных оболочки и окружения. Сегодня рассмотрим оператор $, который позволяет определить значение переменной.
Когда командная оболочка вычисляет переменную, определяет ее значение и подставляет его вместо имени. Чтобы выполнить задачу, нужно просто поставить знак $ перед именем.
Самый простой способ увидеть, как оболочка обрабатывает символ — запустить команду echo, которая выводит свои аргументы (после того, как оболочка завершит их вычисление):
Когда вы выводите на экран значение переменной с помощью команды echo, вы можете подумать, что сама команда проверяет переменную и выводит ее значение.
На самом деле это не так, команда ничего не знает о переменных. Она просто выводит на экран любые аргументы, которые вы ей передаете. Значения для HOME и USER вычисляет оболочка перед запуском команды.
Вы можете определить или изменить переменную в любое время, используя следующий синтаксис:
Например, если вы часто работаете с каталогом "Projects" внутри домашней директории, вы можете присвоить его имя переменной:
И использовать его как удобное сокращение при работе с cd:
Вы можете передавать $work любой команде, ожидающей имя каталога, в качестве аргумента:
Вообще, этот принцип важно понять: оболочка вычисляет переменные, шаблоны и другие конструкции перед выполнением команды.
Шаблоны vs переменные
Предположим, вы хотите перенести ряд файлов с расширением ".txt" из одного каталога в другой.
Вот два способа сделать это, но один работает, а другой нет:
Метод 1 работает, потому что шаблон соответствует всему пути к файлу — имя каталога dir1 является частью совпадений:
Таким образом, метод 1 работает так, как если бы вы набрали следующую команду:
В методе 2 используются переменные, имеющие только свои буквальные значения, и нет специального инструмента для вычисления путей к файлам:
Следовательно, метод 2 работает так, как если бы вы набрали следующую команду:
Linux++ | IT-Образование
Мы с вами уже как-то говорили про суть переменных оболочки и окружения. Сегодня рассмотрим оператор $, который позволяет определить значение переменной.
Когда командная оболочка вычисляет переменную, определяет ее значение и подставляет его вместо имени. Чтобы выполнить задачу, нужно просто поставить знак $ перед именем.
Самый простой способ увидеть, как оболочка обрабатывает символ — запустить команду echo, которая выводит свои аргументы (после того, как оболочка завершит их вычисление):
$ echo My name is $USER and my files are in $HOME
My name is xoadmin and my files are in /home/xoadmin
$ echo ch*ter9
chapter9
Когда вы выводите на экран значение переменной с помощью команды echo, вы можете подумать, что сама команда проверяет переменную и выводит ее значение.
На самом деле это не так, команда ничего не знает о переменных. Она просто выводит на экран любые аргументы, которые вы ей передаете. Значения для HOME и USER вычисляет оболочка перед запуском команды.
Вы можете определить или изменить переменную в любое время, используя следующий синтаксис:
name=value
Например, если вы часто работаете с каталогом "Projects" внутри домашней директории, вы можете присвоить его имя переменной:
$ work=$HOME/Projects
И использовать его как удобное сокращение при работе с cd:
$ cd $work
$ pwd
/home/xoadmin/Projects
Вы можете передавать $work любой команде, ожидающей имя каталога, в качестве аргумента:
$ cp myfile $work
$ ls $work
Myfile
Вообще, этот принцип важно понять: оболочка вычисляет переменные, шаблоны и другие конструкции перед выполнением команды.
Шаблоны vs переменные
Предположим, вы хотите перенести ряд файлов с расширением ".txt" из одного каталога в другой.
Вот два способа сделать это, но один работает, а другой нет:
# Метод 1
$ mv dir1/*.txt dir2
# Метод 2
$ FILES="file1.txt file1.txt"
$ mv dir1/$FILES dir2
Метод 1 работает, потому что шаблон соответствует всему пути к файлу — имя каталога dir1 является частью совпадений:
$ echo dir1/*.txt
dir1/file1.txt dir1/file2.txt
Таким образом, метод 1 работает так, как если бы вы набрали следующую команду:
$ mv dir1/file1.txt dir1/file2.txt dir2
В методе 2 используются переменные, имеющие только свои буквальные значения, и нет специального инструмента для вычисления путей к файлам:
$ echo dir1/$FILES
dir1/file1.txt file2.txt
Следовательно, метод 2 работает так, как если бы вы набрали следующую команду:
$ mv dir1/file1.txt file2.txt dir2
/bin/mv: cannot stat 'file2.txt': No such file or directory
Linux++ | IT-Образование
4300
06:32
27.12.2024
close
С этим каналом часто покупают
Отзывы канала
Отзывов нет
Новинки в тематике
Лучшие в тематике
Выбрано
0
каналов на сумму:0.00₽
Подписчики:
0
Просмотры:
Перейти в корзинуКупить за:0.00₽
Комментарий