Из страницы справочника крона:
При выполнении команд любой вывод отправляется по почте владельцу crontab (или пользователю, названному в переменной среды MAILTO в crontab, если такой существует). Дочерним копиям крона, выполняющего эти процессы, принудили их имя к верхнему регистру, как будет замечен в системном журнале, и PS произвел.
Таким образом, необходимо проверить Ваш/корень почту или системный журнал (например,/var/log/syslog).
Вы путаете аргументы и стандартный вход. Передача по каналу данных к программе не эквивалентна предоставлению его параметры командной строки.
В Вашем первом случае Вы не передаете аргументов своему сценарию, только подавая его данные через его стандартный входной поток. Так $1
сброшен на целое время сценария.
Первый вызов more
таким образом не имеет никакого параметра и разбивает на страницы стандартный вход. Это отображает то, что Вы передали по каналу там (dir1
, как текст). Последующее echo
только печатает новую строку, так как это не заставляет ничего печатать, и последнее more
не имеет ничего больше для печати любого - стандартный вход был "истощен" первым.
Во втором случае Вы действительно передаете аргумент. Так $1
имеет значение dir2
в сценарии. То же самое происходит, за исключением того, что первое more
оба:
dir2
и ошибки, так как это - каталогЭхо делает то, что ожидается, учитывая, что $1
содержит dir2
, и последнее more
только ошибки на dir2
- это не имеет ничего для чтения из стандартного входа.
Различие находится в "Аргументах" VS "Стандартный Вход".
Когда Вы работаете echo dir1 | bash script.sh
, $1
аргумент в Вашем script.sh
всегда пусто, поскольку никакой аргумент не дан ему (попытайтесь добавить a set -x
при начинании и Вы будете видеть его в выводе отладки). dir1
то, которое отражено, прибывает из стандартного входа как more
управляйте читает stdin, если никакой аргумент не дан (помнить $1
пусто).
Как cmd1 | cmd2
работы
При использовании канала:
cmd2
подпроцесс cmd1
.cmd2
"включается" на stdout cmd1
.Поскольку Linux stdio lib предложил буферизированный поток через дескриптор файла, stdin содержание будет использовано (т.е. только для чтения однажды) только, когда stdin будет открыт.
Шаг за шагом cmd1 | cmd2
рабочий процесс
Команда Example:
echo dir1 | (echo "a" ; read stdinvalue; echo "$stdinvalue")
echo dir1 |
: запишите"dir1\n
"на stdout первой команды, которая не отражена, но буферизована через stdio и доступная для подобрабатывания через stdin.echo "a"
: запишите"a\n
"на stdout; не читает stdin! так"dir1\n
"строка все еще доступнаread stdinvalue
: считайте stdin до EOL (или EOF), и хранит строку в переменной удараecho "$stdinvalue"
: запишите stdinvalue значение переменной в stdout
more
пролистывает стандартный вход, не интерпретируя это, если Вы даете ему что-то на стандартном входе. Это не смотрит наdir1
вообще в любом случае, это просто печатает его дословно. – Mat 07.05.2013, 10:38read
встроенный для обработки данных от стандартного входа или других файлов также. – Mat 07.05.2013, 11:11