Перенаправление ввода / вывода в Linux — это функция командной строки, которая позволяет направлять стандартные потоки в указанное пользователем место. Одним из наиболее распространенных вариантов использования перенаправления является запись вывода команды в файл.
В этой статье мы расскажем, как сохранить вывод команды в файл в ОС Linux.
Вывод результата работы команды на экран
В Linuxкомандынаправляют результат своей работы в стандартный поток вывода, который также называется stdout. Благодаря этому, Вы можете просматривать вывод утилит в окне терминала.
Допустим, нам нужно узнать общий доступный объем памяти в Linux. Для этого выполним команду df без аргументов и опций:
Вы могли заметить, что в выводе команды объем памяти записан в байтах. Если для Вас такая запись неудобна, достаточно использовать опцию -h или --human-readable для вывода в более удобном формате (в таком случае команда отображает данные в килобайтах, мегабайтах и гигабайтах):
Запись в файл с помощью перенаправления
Для записи результата работы команды в какой-либо файл используется оператор перенаправления >. Он, собственно, и направляет вывод команды (stdout — поток 1) в файл.
К примеру, запишем вывод команды df -h в file.log:
Если необходимо чтобы содержимое файла не перезаписывалось каждый раз, а дописывалось в конецфайла, то используем следующую конструкцию:
Если необходимо сохранить вывод стандартного потока вывода ошибок, то используем следующую конструкцию:
Если необходимо сохранить вывод стандартного потока и стандартного потока вывода ошибокв разные файлы, то используем следующую конструкцию:
Если необходимо сохранить вывод стандартного потока и стандартного потока вывода ошибок в один файл, то используем следующую конструкцию:
Запись вывода команды в файл с помощью tee
Конвейер в Linux применяется для передачи вывода одной команды на ввод другой. Чтобы записать результат выполнения df -h в файл file1.log с помощью tee — используйте следующую команду:
Если указанный файл уже существует, и Вы не хотите его полностью перезаписывать, напишите опцию -a или --append с командой tee, как это показано ниже:
Если Вас интересует более подробная информация об этих двух командах, тогда используйте параметр --help или загляните на справочную страницу man:
Выводы
Сохранение вывода команды в файл — повседневная задача в Linux. Мы показали два способа ее выполнения. Подобные навыки пригодятся любому системному администратору, а также могут упростить работу представителям других ИТ-профессий.
Спасибо за время, уделенное прочтению статьи!
Если возникли вопросы — задавайте их в комментариях.
Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco, курсы по кибербезопасности, полный курс по кибербезопасности, курсы DevNet / DevOps (программируемые системы) от Академии Cisco, курсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).
Курсы Cisco, Linux, кибербезопасность, DevOps / DevNet, Python с трудоустройством!
Поможем стать экспертом по сетевой инженерии, кибербезопасности, программируемым сетям и системам и получить международные сертификаты Cisco, Linux LPI, Python Institute.
Предлагаем проверенную программу с лучшими учебниками от экспертов из Cisco Networking Academy, Linux Professional Institute и Python Institute, помощь сертифицированных инструкторов и личного куратора.
Поможем с трудоустройством и стартом карьеры в сфере IT — 100% наших выпускников трудоустраиваются.
Как проходит обучение?
Проведем вечерние онлайн-лекции на нашей платформе.
Согласуем с вами удобное время для практик.
Если хотите индивидуальный график — обсудим и реализуем.
Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
Всем, кто боится потерять мотивацию и не закончить обучение, предложим общение с профессиональным коучем.
А еще поможем Вам:
отредактировать или создать с нуля резюме;
подготовиться к техническим интервью;
подготовиться к конкурсу на понравившуюся вакансию;
устроиться на работу в Cisco по специальной программе. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco, Linux LPI, кибербезопасность, DevOps / DevNet, Python, подайте заявку или получите бесплатную консультацию.
Настоящий Linux-ниндзя, который живет в мире бесконечных терминалов и готов рассказать всем о преимуществах этой операционной системы, пока его еда не остынет!
? ?
Каменный гость
На днях столкнулся с интересной проблемой. В одном компьютере установлено 4 Гб оперативной памяти. Исходно при покупке на нём была установлена операционная система Windows Vista. Кстати, как это ни удивительно, это была 32-битная версия системы. Но просуществовала она там недолго, и я сам ставил на этот компьютер привычную тогда Windows XP SP2, тоже 32-битную. Естественно, оперативная память, доступная системе, составляет, по словам “Свойств системы”, 3,25 Гб. А вот из каких соображений был задан объём файла подкачки, и мной ли он был тогда задан, системой, или кем-то ещё – не понимаю. А сейчас, в попытках ускорить работу компьютера, я решил посмотреть в соответствующее окно. Так вот, минимальный объём этого файла был выбран равным 2500 Mб, а его максимальный объём был выбран равным 4990 Мб. Оба числа удивили и заставили задуматься. 🙂 Когда оперативной памяти (далее RAM) в компьютере мало (до 2 Гб), то с виртуальной всё просто. Windows автоматически при установке выбирает минимальный объём файла подкачки, равный 1,5*RAM, а максимальный – 2*RAM. В данном же случае всё не так просто. Как я уже написал, здесь RAM=4096 Мб. Тупое применение этого правила даёт результаты Fmin=6144, Fmax=8192. Однако, во-первых, Windows “видит” только ~3300 Мб, поэтому именно это значение следует использовать в формулах. Во-вторых, возникает вопрос, есть ли смысл задавать файл подкачки большего размера, чем система способна “видеть”? В-третьих, что-то всплыло в памяти, будто система мне уже когда-то не позволяла сделать файл подкачки больше 4096 Мб. Ну, конечно, первым делом решил попробовать – позволит или не позволит. Как видим, позволяет. А ведь точно помню, что не позволяла! Может быть, это в третьем сервиспаке ввели ограничение, а во втором можно писать, что угодно? Стал проверять на других компьютерах. И что интересно, с сервиспаком это никак не связано. В англоязычных SP2 и SP3 можно выставить любой объём. А вот в русскоязычном XP SP3, действительно, больше 4096 Мб выставить не дают. Связано ли это именно с языком интерфейса или с чем-то ещё – пока понять трудно, т.к. пока нашёл только один компьютер с русскоязычной XP. (Не люблю я русскоязычные интерфейсы и стараюсь от них избавляться, когда есть существенный повод. Но бывают случаи, когда Windows работает и повода от него избавляться не даёт.)
P.S. В процессе написания поста подумал о том, что ограничение размера файла виртуальной памяти в 4096 Мб может быть связано с файловой системой FAT32, применявшейся на диске, на котором создаётся этот файл. Надо бы и это проверить.
P.P.S. Так и есть. Если диск отформатирован в файловой системе FAT32, система не позволяет выбрать объём файла подкачки больше 4096 Мб.
При выполнении каких-либо команд в командной строке или PowerShell результат их выполнения отображается прямо в консоли: это удобно, но иногда требуется вывести сохранить эти результаты в файл для дальнейшей работы или анализа.
В этой инструкции подробно о том, как выводить результаты выполнения команд Windows не только в окне консоли, но и в текстовый файл на диске. На близкую тему: Способы создания текстового файла в командной строке и PowerShell.
Командная строка
Для команд командной строки возможны несколько способов вывода результатов в файл. Сама команда может быть любой, но в зависимости от того, какой из подходов вы будете использовать, результат будет отличаться.
Вывести результат выполнения команды командной строки в текстовый файл можно следующими способами:
Первый вариант — простой вывод в файл. При этом если файл уже существует, он будет перезаписан, а в окне консоли вывод команды не отобразится:
команда > путь_к_файлу
Пример вы можете увидеть на скриншоте ниже.
Второй метод не затирает предыдущее содержимое файла, если оно уже есть, а добавляет вывод команды к уже имеющемуся в файле содержимому. Как и в предыдущем случае в окне консоли результат отображаться не будет:
команда >> путь_к_файлу
Например, для команд приведенных на скриншоте, результат будет записан в файл дважды.
Если требуется вывод в файл с одновременным выводом в окне командной строки, можно использовать следующий подход:
команда >> путь_к_файлу | type путь_к_файлу
В последнем случае вывод команды будет сохранен в файл, а затем уже содержимое сохраненного файла отображено в окне консоли.
Windows PowerShell
Если команды выполняются в PowerShell, вы можете использовать команду Tee-Object следующими способами:
Вывод результатов команды в текстовый файл и консоль с перезаписыванием данных в файле:
команда | tee путь_к_файлу
Вывод результатов команды в файл с добавлением вывода к имеющемуся содержимому файла:
команда | tee -append путь_к_файлу
Если нужно вывести в файл результаты выполнения ряда команд, включая сообщения об ошибках, вы можете использовать следующих подход:
Start-Transcript -Path "путь_к_файлу"
ваши команды
Stop-Transcript
В части PowerShell приведены лишь базовые варианты, в действительности возможностей вывода нужных данных при выполнении команд в файл в этом языке присутствует больше. Но, надеюсь, для большинства моих читателей приведённых сведений будет достаточно для их задач.
В этой статье мы расскажем, как создать и настроить собственный сервер WireGuard.
Что такое WireGuard
WireGuard — это современный и безопасный VPN-протокол, который используется для зашифрованной передачи данных. Одним из ключевых преимуществ WireGuard является его простота. В WireGuard всего около 4000 строк кода по сравнению с десятками тысяч в других VPN-протоколах. Такая простота приводит к повышению производительности, поскольку требуется меньше вычислительной мощности. Кроме того, WireGuard использует современную криптографию, что делает его более устойчивым к уязвимостям и обеспечивает высокий уровень безопасности для пользователей. Приложение для клиентов доступно на устройствах с ОС Android, iOS, MacOS, Windows, Linux.
Почему стоит выбрать WireGuard
Простота использования. WireGuard легко и быстро настраивается, поэтому он подходит как для опытных пользователей, так и для новичков.
Безопасность. Протокол WireGuard использует современные алгоритмы шифрования для обеспечения безопасности передаваемых данных.
Высокая скорость. Благодаря своей легковесной архитектуре WireGuard обеспечивает высокую скорость передачи данных.
Надежность. WireGuard активно развивается и поддерживается сообществом разработчиков, что обеспечивает стабильную работу протокола.
Кроссплатформенность. WireGuard доступен для большинства операционных систем: Linux, Windows, macOS, Android и iOS.
Как заказать готовый VPN-сервер WireGuard
В Рег.ру вы можете заказать сервер с автоматической установкой WireGuard. Чтобы создать свой сервер WireGuard:
Перейдите на страницу заказа услуги.
Выберите регион размещения сервера:
В блоке «Образы» перейдите на вкладку Приложения и панели управления и выберите образ WireGuard:
Выберите подходящий вам тарифный план:
Нажмите Заказать сервер:
Готово, вы заказали готовый WireGuard Linux-сервер. На ваш контактный email будет направлено письмо с доступами к серверу и веб-интерфейсу WireGuard:
Как открыть веб-интерфейс WireGuard
Перейдите в личный кабинет.
Нажмите на кнопку Рег.облако:
Нажмите Виртуальные серверы:
Напротив нужного сервера нажмите на монитор с шестеренкой (Открыть приложение):
Готово, вы авторизовались в WireGuard UI.
Как добавить нового клиента WireGuard
Перейдите в веб-интерфейс WireGuard и нажмите New Client:
Укажите имя клиента и email. Нажмите Sumbit:
Нажмите Apply Config:
Готово, создание своего VPN-клиента завершено.
Как подключиться к WireGuard VPN
Установите приложение WireGuard. Скачать WireGuard-клиент можно на официальном сайте.
Откройте приложение WireGuard.
Нажмите Импорт туннелей из файла и выберите скачанный ранее конфигурационный файл:
Нажмите кнопку Подключить:
Рассмотрим подключение на примере операционной системы Ubuntu:
Установите WireGuard с помощью команды:
sudo apt install wireguard
cp your-config.conf /etc/wireguard/wg0.conf
где your-config.conf — имя конфигурационного файла.
Подключитесь к VPN через WireGuard c помощью команды:
Загрузите приложение WireGuard.
Откройте приложение и нажмите Добавить туннель.
Добавьте новый туннель для WireGuard одним из способов:
Создать из файла или архива — добавление туннеля при помощи скачанного конфигурационного файла,
Создать из QR-кода — добавление туннеля при помощи сканирования QR-кода,
Создать с нуля — добавление туннеля вручную:
Затем у вас будет запрошено разрешение на добавление конфигураций VPN. Нажмите Разрешить:
Чтобы подключиться к VPN, переведите переключатель в положение ON:
Загрузите приложение WireGuard.
Откройте приложение и нажмите на кнопку +:
Добавьте новый туннель одним из способов:
Импорт из файла или архива — добавление туннеля при помощи скачанного конфигурационного файла,
Сканировать QR-код — добавление туннеля при помощи сканирования QR-кода,
Создать с нуля — добавление туннеля вручную:
Чтобы подключиться к VPN, переведите переключатель в положение ON:
Как установить WireGuard вручную
Если вы хотите создать личный VPN-сервер вручную, следуйте инструкции по установке WireGuard, которая представлена ниже. Она подойдет для ОС Ubuntu 18.04, 20.04 и 22.04.
Установка и настройка WireGuard-сервера
Обновите список пакетов с помощью команды:
Чтобы установить WireGuard, введите команду:
sudo apt install wireguard
Перейдите в директорию WireGuard с помощью команды:
Сгенерируйте пару ключей для подключения к VPN-серверу с помощью команды:
wg genkey | tee /etc/wireguard/server_privatekey | wg pubkey | tee /etc/wireguard/server_publickey
С помощью команды cat проверьте, добавлены ли сгенерированные ключи в файлы:
cat server_privatekey
cat server_publickey
Если ключи сгенерированы успешно, вы увидите следующее:
Создание ключей при настройке сервера WireGuard
Далее необходимо настроить конфигурационный файл. Прежде чем приступить к настройке, определите имя своего сетевого интерфейса с помощью команды:
Чтобы поднять свой WireGuard VPN, перейдите к редактированию конфигурационного файла. Для этого введите команду:
Добавьте в конфигурационный файл следующие параметры:
[Interface]
PrivateKey = <privatekey> # Приватный ключ из файла server_privatekey
Address = 10.0.0.1/24 #Адрес VPN-сервера в частной сети
ListenPort = 51830 #Порт, который будет слушать VPN-сервер
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o <interface> -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o <interface> -j MASQUERADE
Вместо <privatekey> необходимо указать значение приватного ключа из файла /etc/wireguard/server_privatekey, а вместо <interface> — имя вашего сетевого интерфейса.
Сохраните изменения, нажав Ctrl+X+Y.
Настройте IP forwarding с помощью команды:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
Проверьте, внесены ли изменения, с помощью команды:
Вывод должен быть следующим:
Настройте автоматический запуск WireGuard VPN Server с помощью команды:
systemctl enable wg-quick@wg0.service
Запустите собственный VPN-сервер с помощью команды:
systemctl start wg-quick@wg0.service
Проверьте корректность работы сервера с помощью команды:
systemctl status wg-quick@wg0.service
Если сервер для WireGuard запущен успешно, вы увидите статус active:
Настройка WireGuard VPN
Настройка клиентской части WireGuard
Создайте пары ключей для подключения клиента к VPN с помощью команды:
wg genkey | tee /etc/wireguard/user1_privatekey | wg pubkey | tee /etc/wireguard/user1_publickey
Имена файлов с ключами должны быть уникальными для каждого клиента.
С помощью команды cat проверьте, добавлены ли сгенерированные ключи в файлы:
cat user1_privatekey
cat user1_publickey
Откройте конфигурационный файл с помощью команды:
Добавьте в конфигурационный файл следующие параметры:
[Peer]
PublicKey = <pubickey> #Публичный ключ клиента
AllowedIPs = <allowedip> #IP-адрес в частной сети, который будет присвоен клиенту
Сохраните изменения, нажав Ctrl+X+Y.
После внесения изменений перезагрузите сервер WireGuard:
systemctl restart wg-quick@wg0
Проверьте корректность работы сервера с помощью команды:
systemctl status wg-quick@wg0.service
Если сервер запущен успешно, вы увидите статус active:
Для подключения к серверу создайте конфигурационный файл клиента с расширением .conf и произвольным названием, например, wg.conf. Добавьте в файл следующие параметры:
<client_pivate_key> — приватный ключ клиента, который хранится в файле /etc/wireguard/user1_privatekey,
<client_ip> — IP-адрес клиента, который был указан в конфигурационном файле сервера в параметре «AllowedIPs»,
<server_public_key> — публичный ключ сервера, который хранится в файле /etc/wireguard/server_publickey,
<server_ip> — IP-адрес вашего сервера.
Подключитесь к VPN по инструкции.
Готово, настройка VPN-сервера на базе WireGuard завершена.
Помогла ли вам статья?
Спасибо за оценку. Рады помочь 😊
Вот команды bash, а вы в 80% описали отдельные утилиты, не связанные с bash
Команды bash
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.
A star (*) next to a name means that the command is disabled. job_spec [&] history [-c] [-d offset] [n] or history -anrw [filename]> (( expression )) if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMAN> . filename [arguments] jobs [-lnprs] [jobspec ...] or jobs -x command [args] : kill [-s sigspec | -n signum | -sigspec] pid | jobspec .> [ arg... ] let arg [arg ...] [[ expression ]] local [option] name[=value] ... alias [-p] [name[=value] ... ] logout [n] bg [job_spec ...] mapfile [-d delim] [-n count] [-O origin] [-s count] [-t> bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u > popd [-n] [+N | -N] break [n] printf [-v var] format [arguments] builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir] caller [expr] pwd [-LP] case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esa> read [-ers] [-a array] [-d delim] [-i text] [-n nchars] > cd [-L|[-P [-e]] [-@]] [dir] readarray [-d delim] [-n count] [-O origin] [-s count] [> command [-pVv] command [arg ...] readonly [-aAf] [name[=value] ...] or readonly -p compgen [-abcdefgjksuv] [-o option] [-A action] [-G globp> return [n] complete [-abcdefgjksuv] [-pr] [-DEI] [-o option] [-A act> select NAME [in WORDS ... ;] do COMMANDS; done compopt [-o|+o option] [-DEI] [name ...] set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] continue [n] shift [n] coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...] declare [-aAfFgilnrtux] [-p] [name[=value] ...] source filename [arguments] dirs [-clpv] [+N] [-N] suspend [-f] disown [-h] [-ar] [jobspec ... | pid ...] test [expr] echo [-neE] [arg ...] time [-p] pipeline enable [-a] [-dnps] [-f filename] [name ...] times eval [arg ...] trap [-lp] [[arg] signal_spec ...] exec [-cl] [-a name] [command [arguments ...]] [redirecti> true exit [n] type [-afptP] name [name ...] export [-fn] [name[=value] ...] or export -p typeset [-aAfFgilnrtux] [-p] name[=value] ... false ulimit [-SHabcdefiklmnpqrstuvxPT] [limit] fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [c> umask [-p] [-S] [mode] fg [job_spec] unalias [-a] name [name ...] for NAME [in WORDS ... ] ; do COMMANDS; done unset [-f] [-v] [-n] [name ...] for (( exp1; exp2; exp3 )); do COMMANDS; done until COMMANDS; do COMMANDS; done function name { COMMANDS ; } or name () { COMMANDS ; } variables - Names and meanings of some shell variables getopts optstring name [arg] wait [-fn] [id ...] hash [-lr] [-p pathname] [-dt] [name ...] while COMMANDS; do COMMANDS; done help [-dms] [pattern ...] { COMMANDS ; }
В хабе “разработка под Windows” я бы все-таки не ожидал видеть инструкцию по применению утилит из *nix – учитывая, что в Windows есть PowerShell.
PowerShell очень медленно работает. Утилиты из СygWin делают то же в 3 раза быстрее.
(а) мне хватает скорости PowerShell (б) я не хочу (а иногда – не могу) ставить cygwin
для Windows powershell отличный инструмент, единственное заметное неудобство – отличается набор команд в разных версиях , приходится при написании ориентироваться на 3 версию
мне хватает скорости PowerShell
Что-то народ не особо ратует за PowerShell. Не подскажете почему?
Понятия не имею. Подозреваю, что зависит от выборки, на которой вы собирали данные.
если вызывать из повершелла гну утилиты, то может и медленно. Но Powershell не под них оптимизирован. Сам по себе он вполне себе быстр.
Наверное этот текст обидит чувства Windows пользователей, так как тут по сути предлагается использовать Unix(овые) утилиты в OS Windows.
Многие пользователи Windows, которых я знаю, религиозно презирают Linux и всё, что с этим связано.
Я вот пользуюсь и Windows, и Linux (точнее, его контейнерными производными и изредка WSL). Вопрос не в презрении, вопрос в выборе подходящего инструмента.
Но возможно не стоит публиковать текст, если вы серьезно думаете, что он обидит чувства какой-то значимой группы читателей.
Многие пользователи Windows, которых я знаю, религиозно презирают Linux и всё, что с этим связано.
в 99% так делают технически ограниченные люди
Наверное этот текст обидит чувства Windows пользователей, так как тут по сути предлагается использовать Unix(овые) утилиты в OS Windows.
Не пользователей, а ламеров. Для сведения, OS Windows сама когда-то поддерживала POSIX во времена windows NT и windows 2000, а сейчас внедрила еще более полноценный WSL
cygwin и mingw были доступны всем, кто хотел. Презирать религиозно – изначально не очень подход для технического человека.
В хабе “разработка под Windows” я бы все-таки не ожидал видеть инструкцию по применению утилит из *nix – учитывая, что в Windows есть PowerShell.
Вы можете для каждой команды из этой заметки привести команду из PowerShell, которая делает ту же работу?
Наверное, могу, но не хочу тратить на это свое время.
Наверное, могу, но не хочу тратить на это свое время.
Спасибо, Вы только что доказали нам всем бессилие PowerShell!
Эээ, нет, я ничего вам не доказал.
Извините, мне кажется, вас несет.
du -lhs `ls` оч помогает искать место на чистой системе, статья должна быть докторская конечно. cygwin в windows очень помогает
Полезные Утилиты Командной Строки Bash
Все команды bash по своему полезны, да. И утилиты из coreutils тоже, даа..
Есть ошибки. И заголовок неточный.
Не нужно писать статью, если вы просто решили поделиться полезными командами из своего персонального читщита, но не владеете материалом. Тем более что подобных базовых примеров много не только в инете но и на Хабре.
Как можно путать баш и шелл, если bash и есть shell (один из многих)?
Как можно путать баш и шелл, если bash и есть shell (один из многих)?
“консоль гит и консоль гит-баш”.
Git for Windows создаёт ярлык и для Git Bash, и для Git CMD. Они оба откроют консоль, но очень разную.
А так, что есть оригинальный sh (который и есть shell), и есть множество потомков-наследников: bash, dash, fish, zsh, и так далее.
Ну и я часто получал вопрос вида – “What shell do you prefer ?” И всегда было понятно о чем речь, при этом я никогда не душнил типа – не shell, а linux command shell )))
Из этой же серии – “Какой линукс ты используешь ?” Формально вопрос не совсем корректный, но все все понимают
А еще есть переменная окружения SHELL
И всегда было понятно о чем речь
но консоль гит и линукс шелл это настолько разные вещи, что в данном случае следует уточнять, когда автор статьи утверждает про консоль гит (а не гит-баш).
Переменная окружения SHELL в данном случае не про то вообще. Мы говорим про разницу в терминах между shell и git. Ведь cmd.exe тоже shell. И explorer.exe тоже shell.
А так, что есть оригинальный sh (который и есть shell), и есть множество потомков-наследников:
Спасибо, конечно, но на 4-м десятке лет работы с Unix я это знаю чуть более, чем хорошо. А теперь попробуйте рассказать мне, чем будут отличаться способы запуска и результаты исполнения любых из приведённых автором команд?
Видите ли, “bourne again shell” или “z shell” не перестали быть shell’ами из-за своих названий. Более того, все перечисленные вами shell’ы — одного поля ягоды, все выросли из bourne shell. И автор статьи не привел ни одного примера откровенного “башизма”, все его примеры будут одинаково работать во всех bourne-shell-наследованных шеллах, поэтому задам вопрос ещё раз — как можно путать shell и shell? А ещё лучше — покажите, где именно автор этой статьи (да, убогой, тут даже спорить не о чем) “путает баш и шелл” (в чём его обвинил автор изначального комментария ветки)?
Git for Windows создаёт ярлык и для Git Bash, и для Git CMD. Они оба откроют консоль, но очень разную.
Прежде, чем писать такое, следовало бы хоть минимально исследовать вопрос.
До установки Windows Terminal (в составе которого есть Open Console), в Windows была и есть одна единственная “консоль” — ранее conemu.exe, ныне conhost.exe. Я не просто так беру в кавычки, поскольку функционально это никакая не консоль, а весьма убогий эмулятор терминала, который способен лишь рендерить символы да интерпретировать довольно скромный набор управляющих последовательностей. От него, собственно, большего и не требуется. И какой бы “ярлык” Git for Windows ты ни выбрал — хоть Git bash, хоть Git CMD — та самая пресловутая “консоль” у этих окошек будет одна и та же. А вот что в них будет действительно “очень разным”, так это интерпретатор команд, взаимодействующий с пользователем. Так называемый шелл, ага. Только в одном случае он будет mingw-сборкой GNU bash, а в другом — убогий родной виндовый cmd.exe. Но “консоль” — та же самая, независимо от выбора “ярлыка”. Да, и на работу собственно Git это не влияет примерно никак.
Но мой вопрос — чем же всё таки отличаются “консоль гит” (и что это вообще такое?) и “консоль гит-баш” — ответа я так и не получил. Но я, признаться, не особо и претендую.
Установите гит для винды. Запустите git-bash.exe и git-cmd.exe Выполните команду help в каждой из них
Скажите – вы не видите разницы?
До установки Windows Terminal (в составе которого есть Open Console), в Windows была и есть одна единственная “консоль” — ранее conemu.exe, ныне conhost.exe
С каких пор conemu (conemu.github.io опенсорс проект) внезапно превратился в ms conhost.exe?
Как и автор, вы таки путаете термины консоль и терминал.
Консоль это консоль управления. Поэтому ярлыки, которые ведут к git-bash и git-cmd отличаются тем, что они ведут к разным консолям управления. Ввтор статьи в этом не разбирается, называя git-cmd консолью гита. В этом и смысл, что git-cmd не относится к linux shell/bash никак.
Еще неопытных пользователей может сильно смущать что в PATH в обоих случаях попадают gnu утилиты, которые могут продолжать работать в обеих консолях. И те, кто не понимает разницы между linux shell и gnu tools тоже могут запутаться.
Я всегда ставлю модуль Posh-Git и с ним замечательно работается в git прямо из обычного PowerShell без всяких git-bash(cmd)
С гит и так работается из powershell. Posh-Git просто добавляет удобства автокомплитом и форматированием.
Но под капотом гит все равно юзает gnu утилиты именно тем способом, который принят в linux shell, а не в повершелле
Очень очень плохая статья.
Тем не менее народ себе в закладки статью-то понадобавлял.
А я не душнила. Сохраню в закладках и буду пользоваться по необходимости. Если это работает, то мне не важно, как это называется. Спасибо, автор!
Раньше был такой шутливый вопрос: чем отличается чайник и ламер?
Уважаемый, а хотите я анекдот про теоретиков и практиков расскажу?
Таким практикам, как автор статьи, я регулярно помогаю на тостере.
Команды Bash можно с легкость отрабатывать на Windows, если установить GIT и открыть консоль GIT.
То, что при установке git, устанавливается ещё и МинГВ, никак не оправдывает.
С таким же успехом можно было сказать, что для работы в Юникс-образной командной строке установите ПО ” Ёклмн”, в состав которого случайно входит МинГВ. ))
Я пользуюсь WSL если мне нужно сделать что-то непосредственно на моем компе.
Я бы еще добавил одну из самых часто используемых команд:
Ну и возможны вариации с фильтрами, сортировками и уникальными значениями.
netstat deprecated. Нужно отвыкать.
Ну, как бы не depecated, а obsoleted. И только в пингвиниксе. У остальных живёт и развивается.
Это команда приведена только для примера, что через консоль можно делать поиск поверх предыдущего поиска. Так называемый многоступенчатый поиск. Встроенному поиску из-под GUI-IDE такое даже и не снилось.
Если говорить метафорично, то утилиты Unix – это как химическая посуда (пробирки, колбы, мензурки, воронки, фильтры, капельницы, часовые стекла, стеклянные палочки), только применительно к данным (числам и тексту). Видимо авторы UNIX в 196х-197х были серьезно вдохновлены химией при разработке компьютерных консольных утилит. Согласитесь, что ну невозможно не заметить этих аналогий между UNIX утилитами и химической посудой.
Плохая аналогия подобна котенку с дверцей.
Не для кого не секрет, что некоторые типичные действия на компьютере проще быстрее и эффективнее выполнить из-под командной строки нежели мышкой в GUI explorer(e). Поэтому в этом тексте я хотел бы поделиться командами, которые мне очень часто помогают в повседневной работе.
То что я тут напишу этим обычно не делятся. Как правило у каждого разработчика есть свой потайной сheat-list полезных консольных команд для выполнения какой-либо работы.
Наверное этот текст также обидит чувства Windows пользователей, так как тут по сути предлагается использовать Unix(овые) утилиты в OS Windows. Многие пользователи Windows, которых я знаю религиозно презирают Linux и всё, что с этим связано. Предвижу что текст уйдет в глубокий минус.
Пользоваться Unix утилитами в OS Windows это тоже, что если бы американские солдаты во время своих зверств во Вьетнаме бросали бы свои винтовки M-16, а пользовались бы исключительно и только автоматами Калашникова. Однако, тем не менее, и такое было!
Но на самом деле нет ничего плохого в том что на Windows 10 запускать Unix утилиты. Это лишь подчёркивает тот факт, что хороший компьютер это, прежде всего, универсальный вычислитель.
Итак, Unix(овые) утилиты для командной строки можно с легкость отрабатывать и в операционной системе Windows, если установить GIT и открыть консоль GIT.
Также их можно установить из CygWin или MinGW.
Полезные команды в интерпретатореBash
26–На работе мне в мессенджер Junior программисты микроконтроллеров часто пишут личные сообщения типа:
Для этого есть очень простой шаблон на основе утилиты grep. Открываешь папку корня workspace репозитория и набираешь команду
grep -rn "UsecToStr(" | grep "\.c:"
Тут опция -r значит искать во всех папках, -n значит показывать в отчете номер строки на которой обнаружилась искомая подстрока. В общем, ступенчатый grep способен найти даже иголку в стоге сена!
Правда в том, что если у Вас локально на SSD/HDD диске есть Си-код и Вы знаете и умеете пользоваться утилитой grep, то Вам в принципе не нужна никакая другая документация для кода! Любую информацию Вы сможете извлечь при помощи grep запросов.
1–Показать абсолютный путь к утилите, например grep
where grep
2–Рекурсивно заменить слово old_word на new_word во всех файлах внутри директории.
grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
Тут для grep -r означает, что искать внутри папок рекурсивно, -l означает показывать только пути к файлам. Для sed -i означает, что замена слова будет произведена прямо в этом же файле (in place), s означает что надо заменить первый токен на второй токен, флаг g заменяет все вхождения заменяемого токена.
Также бывает очень полезно сделать автоматическую замену предложения в конкретном файле. Это часто происходит из-за несовместимости между настройками IDE Eclipse в файле .cproject. Чинится это так.
sed -i -e 's/ARM family/Arm family (-mcpu)/g' .cproject
sed -i -e 's/"GNU Tools for ARM Embedded Processors"/"xPack GNU Arm Embedded GCC"/g' .cproject
25–Во всех файлах в этой папке (включая вложенные папки с файлами) удалить все строки в которых есть ключевое слово KeyWord, начиная с данной директории
find . -type f -print0 | xargs -0 sed -i /KeyWord/d
Вообще с командой sed надо быть очень осторожным! Sed может тихо изменить там, где это не следует (например *.ewp настройки проекта в IAR), и потом не откроется проект в вашей любимой GUI-IDE. Как следствие Вы не сможете больше никогда собрать свой проект. И у Вас могут начаться из-за этого паника, судороги и конвульсии.
3–Показать размер папок
du -a --max-depth=1 | sort -n
4–Показать переменные окружения. Это очень частая команда для проверки системы перед сборкой.
env
5–Найти все файлы с расширением .bak
find . -type f -name "*.bak"
6–Удалить все файлы с расширением .bak
find . -type f -name "*.bak" -delete
7–Открыть все *.mk файлы
for f in $(find . -name '*.mk' -not -name "sub"); do start Notepad++ $f; done
8–Удалить строку 35 из файла file.doti
sed -i '35d' file.doti
9–Найти все директории с именем Drivers в данной папке
find . -name 'Drivers' -type d
10–Найти *.с и *.mk файлы в локальном GIT репозитории
19– Команда, которая ищет во всех файлах проекта места с упоминанием ключевого слова “LED”, причем только в файлах board.h
grep -rn LED | grep board.h
Это команда приведена только для примера, что через консоль можно делать поиск поверх предыдущего поиска. Так называемый многоступенчатый поиск. Встроенному поиску из-под GUI-IDE такое даже и не снилось.
20–Показать состояния TCP соединений.
netstat -n -p TCP
Опция -n показать IP адрес и локальный порт, -p значит указать название протокола
21– Автоматически отсортировать строчки в конфиг файле по алфавиту и еще при этом удалить повторения.
sort.exe -u config.mk -o config.mk
Мега полезная команда так как после нее образуется минимальный diff в утилите WinMerge. Эту команду вообще надо прописать в скрипты сборки кода.
22–Показать все файлы с расширением *.mk в git репозитории
git status | grep "\.mk"
Вообще консольный git и grep это не иначе как неразрывные друзья! Можно также найти все файлы любого другого расширения. Выбрать то, что вы хотите зафиксировать и сделать очень прицельный и аккуратный коммит.
23–Типичная ситуация. Вы делаете git pull и получаете вот такую картинку.
Проблема это сообщение
Для того чтобы загрузить изменения из удаленного репозитория и продолжить работу надо переименовать папку nrf5340_dk_nortos_max98357a_m. И естественно это можно сделать из командной строки. Грубо говоря, не отходя от кассы.
Далее уже имея две папки (локальная и от удаленного репозитория) можно сравнить две версии в культовой утилите WinMerge и выбрать лучшее из обоих версий файлов для сборки очередной прошивки.
27– Иной раз надо целиком скопировать одну папку в другую папку без лишних вопросов о подтверждении действий. Для этого существует Windows утилита robocopy
robocopy dir/source_dir dir/destination_dir /S
Тут /S означает копировать поддиректории за исключением пустых директорий
24– Найти все папки в которых отсутствуют файлы с расширением *.gvi
comm -3 <(find . -type f -name ".gvi" -exec dirname {} ; |sort -u) <(find . -type d |sort -u)
Сначала строится список всех локальных директорий, которые содержат файлы *.gvi,
find . -type f -name ".gvi" -exec dirname {}
этот список всех локальных директорий, которые содержат файлы *.gvi сортируется.
Затем строится просто список всех локальных директорий
find . -type d
список всех локальных директорий тоже сортируется.
find . -type d |sort -u
После чего эти списки сравниваются и подавляются строчки фигурирующий в обоих файлах (comm –3). Остаются только строчки, которые показывают те папки в которых нет какого-либо специфического расширения.
Это очень удобная команда для самопроверки факта окончания работы по какому-либо программному компоненту. Например добавлению *.cmake файлов в кодовую базу
28– Показать количество строк Си-кода во всей локальной кодовой базе
Это очень полезная команда для оценки масштаба репозитория с которым приходится работать. Например сейчас у меня репозиторий в котором лежит 8.7 миллионов строк кода.
29–Взять все файлы в этой папке и в каждом имени файла переименовать подстроку at24c02mtr на at24cxx
Эта очень удобная команда, когда надо написать программный компонент по образу и подобию другого программного компонента. Сначала переименовываем названия файлов (find+rename)
а потом переименовывает ключевые слова в самих файлах (grep+sed)
grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
и “Вуаля”! Вся работа выполнена двумя строчками кода в командной строке!
Как видите, использование командной строки CLI позволяет снизить утомляемость от напряжения внимания и, как следствие, существенно повысить производительность работы за персональным компьютером PC.
Если говорить метафорично, то утилиты Unix – это как химическая посуда (пробирки, колбы, делительные воронки, мензурки, воронки, фильтры, капельницы, часовые стекла, стеклянные палочки), только применительно к данным (числам и тексту). Видимо авторы UNIX в 196х-197х были серьезно вдохновлены химией при разработке компьютерных консольных утилит. Согласитесь, что ну невозможно не заметить этих аналогий между UNIX утилитами и химической посудой.
Если Вы тоже знаете какие-либо простые элегантные и главное полезные консольные команды, то пишите их в комментариях. Не обязательно из bash можно и из cmd или вообще из powershell(а). Лишь бы эти команды умещались в одну строку.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.