Можно ли использовать символы перенаправления ввода и вывода в одной команде?
ют специальные функции, настраивают команды и помогают нам манипулировать данными. Вот почему мы составили следующий список с наиболее важными специальными символами Bash. Читайте дальше, чтобы узнать, как их использовать и как они могут облегчить вашу повседневную жизнь в Bash.Разделитель путей к папкам (/)
В Bash косая черта (/
) разделяет части пути — подпапки внутри папок. Чтобы посетить папку с именем «pictures» внутри вашей домашней папки, вам нужно будет использовать команду cd
как:
Contents
- 1 Разделитель путей к папкам (/)
- 2 Домашний каталог (~)
- 3 Текущая/над папкой (.)
- 4 Комментарии и отмены (#)
- 5 Диапазоны ([])
- 6 Перенаправление ()
- 7 Трубы (|)
- 8 Разделитель команд (;)
- 9 Подстановочные знаки (*)
- 10 Запуск в фоновом режиме (&)
- 11 Переменные ($)
- 12 Эскейп (\) и кавычки («)
- 13 Перенаправление ввода ()
- 14 Управляющие символы
- 15 Символ арифметического расширения
- 16 Символ оценки
- 17 Символы И (&&) и ИЛИ (||)
- 18 Выполнение и группировка подоболочки
- 19 Часто задаваемые вопросы
Разделитель путей к папкам (/)
/span>USERNAME/Pictures![Терминал, показывающий символ разделителя пути в действии.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-01-folder-separator.png)
Все, что стоит после косой черты в приведенном выше примере, находится внутри того, что предшествует косой черте.
Домашний каталог (~)
Вместо того, чтобы вводить полное имя вашей домашней папки в терминале Bash, вы можете использовать символ тильды (~
). Например, чтобы перейти в домашнюю папку, используйте:
cd ~
![Терминал, показывающий символ домашнего каталога в команде cd.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-02-home-directory-character.png)
Вы также можете включить его в более сложные пути. Например, чтобы отредактировать файл с именем «mydata.txt» в папке «Личные» вашего домашнего каталога, используйте:
nano ~/Personal/mydata.txt
Текущая/над папкой (.)
Вы можете использовать одинарную (.
) или двойную точку (..
), чтобы определить, должно ли действие выполняться внутри текущего каталога или каталога выше соответственно. Одиночная точка (.) соответствует текущей папке, а двойная точка (..) соответствует папке над ней.
П
Домашний каталог (~)
апке «/home/USERNAME/Pictures» и хотите выполнить скрипт под названием «transform_images.sh» в том же каталоге. В этом случае введите:sh ./transform_images.sh
Если после выполнения скрипта вы хотите вернуться в папку над той, в которой вы сейчас находитесь, введите:
cd ..
Это вернет вас из папки «/home/USERNAME/Pictures» в «/home/USERNAME».
![Терминал, показывающий перемещение каталога с помощью оператора двойной точки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-04-double-dot-sample.png)
Комментарии и отмены (#)
Символ решетки (#
) более полезен при написании сценариев Bash, поскольку позволяет добавлять к ним комментарии для дальнейшего использования. Bash игнорирует все, что следует за символом решетки.
В следующем скрипте первая строка определяет, что это скрипт Bash, вторая — это комментарий, который
Текущая/над папкой (.)
ная команда копирования:#!/bin/bash # This is a comment - you can type anything you want here cp file1.txt /home/USERNAME/scripts/file2.txt
![Терминал, показывающий комментарии к файлу сценария bash.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-05-shell-comment-sample.png)
Хеши полезны, даже если вы не пишете скрипт, поскольку они позволяют отменить части команды. Чтобы увидеть это в действии, попробуйте следующую простую команду:
echo I am YOUR_NAME
Тогда попробуйте следующее:
echo I am #YOUR_NAME
Во второй версии вы увидите только «I am», потому что хэш отменяет все, что последовало за ним.
Диапазоны ([])
Вы можете определить диапазоны символов, заключив их в скобки ([]
). Чтобы увидеть это в действии, предположим, вы хотите найти имена папок, начинающиеся с D или M. Введите:
ls [DM]*
![Терминал, показывающий содержимое нескольких каталогов.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-06-brackets-pattern-sample.png)
Возможно, вместо этого вы находитесь в папке, заполненной подпапками, названными в честь каждого г
Комментарии и отмены (#)
редыдущие пять лет в «/home/USERNAME/backup», используйте:cp -r 201[56789] /home/USERNAME/backup
Вы можете еще упростить их с помощью тире (-):
cp 201[5-9] /home/USERNAME/backup
Bash выполнит итерацию от 5 до 9, чтобы включить числа между ними.
Перенаправление (<>)
Используя угловые скобки (<>
), вы можете перенаправить ввод или вывод команды. Например, следующая команда:
ls >> list.txt
перенаправит вывод ls
и сохранит его в файл «list.txt».
![Терминал, показывающий функцию добавления оболочки в bash.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-07-redirection-append-sample.png)
Обратите внимание, что двойная прямоугольная скобка (>>
) добавляет вывод команды в файл. Если вы повторно запустите ту же команду, она добавит ее вывод в конец существующего содержимого. Чтобы заменить его содержимое новыми результатами, используйте одинарные угловые скобки (>
):
ls > list.txt
![Терминал, показывающий функцию замены в bash.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-08-redirection-replace-sample.png)
Трубы (|)
Вы можете объединить различные команды в одно целое для достижения более сложных результатов, используя ка
Диапазоны ([])
Они чем-то похожи на перенаправление ( подробнее об их сходствах и различиях здесь ).Предположим, у вас есть огромный файл с тысячами записей и вы хотите найти в нем свое имя. Вместо поиска в текстовом редакторе выполните следующее:
cat entries.txt | grep 'YourName'
![Терминал, показывающий простой оператор канала между cat и grep.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-09-pipe-grep-sample.png)
В этом случае вывод «entries.txt» будет передан команде grep
.
Совет. Узнайте больше о каналах, потоках данных и перенаправлении от использование sed в Linux .
Разделитель команд (;)
Bash позволяет вводить несколько команд за один раз, разделяя их точкой с запятой (;
). Например, чтобы скопировать две папки в два разных места назначения с помощью одной команды:
cp -r folder1 destination1; cp -r folder2 destination2
![Терминал, показывающий цепочку из нескол<h2><span id=](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-10-command-separator-character.png)
Подстановочные знаки (*)
Возможно, вы уже использовали звездочку (*
) в некоторых командах. Он соответствует любой последовательности символов и позволяет выполнять такие действия, как копирование всех файлов JPG из одной папки в другую:
cp /home/USERNAME/folder1/*.jpg /home/USERNAME/folder2/
![Терминал, показывающий копию нескольких файлов с использованием подстановочных знаков оболочки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-11-wildcard-copy-sample.png)
Знак вопроса (?
) также является подстановочным знаком в Bash, но соответствует только одному символу. Например:
cp /home/USERNAME/201?/*.jpg /home/USERNAME/folder2/
![Терминал, показывающий копирование нескольких файлов в разные каталоги.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-12-multi-directory-copy-wildcards.png)
Приведенная выше команда скопирует все файлы jpg в папки, имена которых начинаются с «201». П
Трубы (|)
очный знак преобразуется в любой буквенно-цифровой символ, а не только в цифры, приведенная выше команда также скопирует любую папку, которая может называться «201A» или «201z».Запуск в фоновом режиме (&)
Вы можете запускать команды как фоновые процессы, просто добавив к команде символ амперсанда (&
):
cp /home/USERNAME/Downloads/huge_file.zip /home/USERNAME/backups &
![Терминал, показывающий программу, работающую в фоновом режиме.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-13-background-process-sample.png)
Вышеупомянутое действие начнет копировать файл огромных_файлов.zip и сразу же перейдет в фоновый режим, позволяя вам продолжать использовать терминал. Команда автоматически завершит работу после завершения. Если вы хотите снова перенести его, вы можете сделать это, набрав fg
, а затем Enter.
Переменные ($)
Знак доллара ($
) позволяет вам настраивать переменные для использования в ваших командах. Чтобы увидеть их в действии, попробуйте ввести в терминале следующее:
myname=YOUR_NAME myage=YOUR_AGE echo "I'm $myname"
![Терминал, показывающий основные переменные оболочки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-14-shell-variables-sample.png)
Обратите в
Разделитель команд (;)
чений переменным знак доллара отсутствует.К вашему сведению: Переменные Bash могут делать больше, чем просто хранить статические данные. Узнайте, как создавать массивы и подоболочки внутри переменных оболочки .
Эскейп (\) и кавычки («)
Если вы хотите использовать какой-либо специальный символ в команде, вам придется его экранировать. Это можно сделать, поставив перед специальным символом обратную косую черту (\
). Например, если у вас есть файл с именем, содержащим восклицательный знак, вам придется вместо этого ввести \!
, чтобы Bash интерпретировал его как восклицательный знак, а не как специальный символ.р>
![Терминал, показывающий ls файла со смешным именем.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-15-escape-characters-sample.png)
Другой способ —
Подстановочные знаки (*)
) или двойные кавычки (""
). Заключив строку в кавычки, любой специальный символ в ней будет рассматриваться как фактический символ. Существует также разница между одинарными и двойными кавычками. Одинарные кавычки будут оценивать заключенную строку как текст, а двойные кавычки позволяют использовать переменные ($
) внутри заключенной строки.
![Терминал, показывающий разницу между одинарными и двойными кавычками.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-16-double-and-single-quotes-sample.png)
Перенаправление ввода (<) и ошибки (2>)
Помимо перенаправления вывода программ, также можно контролировать, откуда поступают входные данные программы. Оператор «меньше» (<
) позволяет «извлекать» данные из файлов, а не «вставлять» в них. Например, следующая команда удалит все повторяющиеся строки в файле «sort.txt» и отсортирует их в алфавитном порядке:
uniq < sort.txt | sort
![Терминал, показывающий простую команду перенаправления ввода.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-17-input-redirection-sample.png)
Вы также можете заставить Bash перенаправлять любые сообщения об ошибках из программы. Следующий код перенаправит вывод команды sort
на «out.txt», а ошибки — на «err.txt»:
sort ./invalid.file > out.txt 2> err.txt
![Терминал, показывающий выходные данные перенаправления ошибки из недопустимого файла.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-18-separate-error-redirection.png)
Кроме того, вы также можете использовать оператор амперсанд (&
), чтобы объединить выходные данные вашей программы с любыми ошибками:
sort ./invalid.file &> out.txt
Управляющие символы
Управляющий символ – это оператор, который позволяет включать в скрипт нетипизируемые символы. Например, следующая команда переместит приглашение на один пробел вниз и на одну табуляцию вправо:
printf "\v\t"
![Терминал, показывающий два разных управляющих символа.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-20-shell-control-characters.png)
Управляющие символы могут поддерживать такие функции, как форматирование Юникода. Это делается с помощью оператора \x
, который интерпретирует каждое значение байта как сегмент глифа Юникода.
Следующий код выведет нулевой знак вместе с символом дельты:
printf "\xe2\x88\x85 \xe2\x88\x86\n"
![Терминал печатает два символа Юнико<h2><span id=](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-21-shell-unicode-characters.png)
Примечание. Вы можете узнать шестнадцатеричное значение глифа Юникода, передав его утилите xxd
:
![Терминал, показывающий шестнадцатеричный дамп символа Юникода.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-22-unicode-character-hexdump.png)
Символ арифметического расширения
Символ арифметического расширения — это оператор, который может решать математические уравнения без каких-либо внешних программ. Он работает, рассматривая все внутри расширения как аргументы для целочисленного вычисления.
Например, следующая строка добавит два числа и выведет результат на экран:
echo $(( 2 + 3 ))
![Терминал, показывающий простую арифметическую команду оболочки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-23-shell-arithmetic-sample.png)
Кроме того, вы также можете использовать переменные внутри любого арифметического расширения. Например, следующий код использует это как основу для простой программы умножения:
#!/bin/bash # Get the first ten multiples of a number. forЭскейп (\) и кавычки («)1; i <= 10; i++ )); do echo $(( $1 * $i )); done
![Терминал, показывающий простую программу умножения, использующую арифметические символы оболочки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-24-shell-arithmetic-script.png)
Символ оценки
Символ оценки — это логический оператор, который помогает создавать условия тестирования внутри ваших сценариев. Он содержит возможность обнаруживать файлы, а также переменные неравенства:
#!/bin/bash string1='Hello' string2='World' if [[ $string1 != $string2 ]]; then echo "The strings are not equal."; fi
![Терминал, показывающий простой оценочный символ оболочки для двух строк.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-25-shell-evaluation-character.png)
В следующем примере оценочный символ также используется для проверки того, содержит ли текущий каталог файл maketecheasier:
#!/bin/bash if [[ -e "maketecheasier" ]]; then echo "There is a file with the name maketecheasier"; fi
![Терминал, показывающий простой тест обнаружения файлов с использованием оценки оболочки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-26-shell-file-detect-evaluation.png)
Символы И (&&Перенаправление ввода (<) и ошибки (2>)
ценочного символа является то, что он может выполнять только одно тестовое условие в любой момент. Чтобы исправить это, Bash предоставляет два дополнительных оператора, которые расширяют возможности оценочного символа.
Символ AND позволяет проверить два условия и вернуть значение только в том случае, если оба из них верны. Например, вы можете использовать его, чтобы убедиться, что функция будет запускаться только в том случае, если она находится в правильном каталоге с правильным файлом:
#!/bin/bash target="/home/ramces/maketecheasier" if [[ $target == $(pwd) && -e "maketecheasier.txt" ]]; then echo "Both conditions are true!" fi
![Терминал, показывающий оператор AND между тестом подоболочки и тестом обнаружения файлов.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-27-shell-and-operator-condition.png)
Подобно AND, символ OR также позволяет проверить два условия за одну оценку. Однако он вернет значение, даже если истинно только одно из условий. В следующем примере это используется для проверки двух похожих каталогов:
#!/bin/bash if [[ -d "directory1" || -d "directory2" ]]; then echo "A suitable directory exists!" fi
![Терминал, показывающий оператор ИЛИ между двумя тестами обнаружения каталогов.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-28-shell-or-operator-condition.png)
Выполнение и группировка подоболочки
Подоболочка — это независимый процесс оболочки, который можно запустить из текущего сеанса. В отличие от обычной оболочки, подоболочка откроется только тогда, когда вы ее вызовете, и закроется, как только она будет решена.
Этот подход предотвращает передачу информации между подоболочками между другими оболочками. Например, программа cat
в следующем коде не найдет «test.txt», даже если подоболочка находится в пр
Управляющие символы
( mkdir sample && cd sample && echo "Hello, MakeTechEasier" > test.txt ; ) && cat test.txt
![Терминал, показывающий базовую командную строку подоболочки.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-29-subshell-execution-example.png)
Несмотря на это, вы все равно можете «группировать» команды, не создавая подоболочку. Это может быть полезно, если вы хотите запускать команды в текущем процессе:
{ mkdir sample && cd sample && echo "Hello, MakeTechEasier" > test.txt ; } && cat test.txt
![Терминал, показывающий строку выполнения групповой оболочки, которая не создает новую подоболочку.](https://saintist.ru/wp-content/uploads/2024/05/bash-special-characters-30-group-shell-execution.png)
Полезно знать: измените свою оболочку, используя новые навыки Bash к настройка вашего файла .bashrc .
Часто задаваемые вопросы
Можно ли в Bash сделать многострочную команду?
Да. Вы можете сделать это, добавив escape-символ в конце команды. Это переместит курсор на следующую строку без запуска программы.
Можно ли вернуть предыдущую фоновую программу на передний план?
Да. Для этого вам нужно запустить команду jobs
и найти номер задания нужного процесса. Затем введите fg
и номер вашей команды, чтобы вернуть ее на передний план.
Можно ли использовать сиСимвол арифметического расширения
ой команде?
Да. Для этого вам необходимо обеспечить перенаправление ввода перед выводом. Например, запуск sed 2q < ./long-file > ./short-file
сообщит sed прочитать «длинный файл», а затем вывести результат в «короткий файл».
Изображение предоставлено: Ксавье Си через Unsplash . Все изменения и скриншоты Рамсеса Реда.