Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Не понял, откуда в восьмой задаче в выводе взялись цифры 8 и 9.
а разве при перенаправлении потока баш хоть что-то возвращает?
Эээ. Смотря какого потока и куда.
добавим в ваш код не перезапись файла, а добавление.
И всё заработает, потому что баш откроет файл на дозапись, и содержимое не пострадает.
а разве при перенаправлении потока баш хоть что-то возвращает?
мне казалось, что вообще никогда ничего не выплевывает в консоль
Все верно, первая задача некорректно составлена.
$ cat 1
The cake is a lie!
$ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1 Ничего на экран не выведет, так же как и (здесь важно > 2 в конце):
$ cat 1
The cake is a lie!
$ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 2Не зависимо от открытия/очищения файлов.
Просто потому что &1 направлен в файл вместо stdout.
Есть заблуждение, что последовательность 1>&2 перенаправляет первый поток во второй, однако, это не так.
bash обнаруживает последовательность 1>&2 и копирует содержимое ячейки 2 в ячейку 1
i>&j
# Redirects file descriptor i to j.
# All output of file pointed to by i gets sent to file pointed to by j.
А вот тут, честно, не понял, откуда stdout? В объяснении есть табличка с дескрипторами.
То есть перенаправление происходит в файл, на который указывает в данный момент j-тый дескриптор. Если j-тый дескриптор станет указывать на другой файл, i-тый останется без изменений
$ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1
После интерпретации команды, но до запуска всех программ bash работает с указанными потоками ввода-вывода. Таким образом файл 1 очищается перед запуском первой программы и cat открывает уже очищенный файл.
Задача 3
$ cat file 1>&2 2>/dev/null
just for fun
Объяснение
Есть заблуждение, что последовательность 1>&2 перенаправляет первый поток во второй, однако, это не так.
Задача 4
Как вывод stdout отправить на stderr, а вывод stderr, наоборот, на stdout?
Ответ
4>&1 1>&2 2>&4
Объяснение
Принцип ровно как и в предыдущей задаче. Именно поэтому нам требуется дополнительный поток для временного хранения.
Пожалуйста, объясните, что именно кэшируется в задаче 6, и как это на результат работы влияет?
скрипт show_var.sh (не забудьте chmod 755 show_var.sh)
#!/bin/bash
echo $MYVAR
в консоли
$ MYVAR=123 ./show_var
123
$ echo $MYVAR
#!/bin/bash --
echo $1Первый и последующие запуски также будут давать одинаковый результат.#!/bin/bash
/bin/unameПри первом запуске, несмотря на присутствие uname в скрипте, будет напечатано лишь «SURPRISE», при последующих — «Linux».
Насколько хорошо ты знаешь bash?