Передача перенаправлений в скрипт bash - PullRequest
0 голосов
/ 07 февраля 2020

Возможно ли передать перенаправление в сценарий bash?

У меня была эта проблема раньше, и я обычно просто обходил ее, передавая параметры и используя их в качестве файловых перенаправлений. в соответствующих местах. В этом случае у меня была строка cron, которая не работала:

0 3 * * * /home/me/some.sh 2>&1 > /folder/I/cant/write/to.log

Я нашел этот трюк run-as-cron для проверки фактической команды (которая вызывает env -i <envs>), например

./run-as-cron /home/me/some.sh

... но я не могу придумать, как передать перенаправление в сценарий (или изменить сценарий, чтобы разрешить его). Попробовал это:

./run-as-cron '/home/me/some.sh 2>&1 > /folder/I/cant/write/to.log'
/usr/bin/env: ‘/home/me/some.sh 2>&1 > /folder/I/cant/write/to.log’: No such file or directory

Что я отчасти ожидал.

Я чувствую, что борюсь с чем-то фундаментальным в bash, и его трудно найти, так как большинство мест просто объясняют bash перенаправление. Я бы хотел перестать игнорировать это, когда встретился с ним, или либо знаю, что это невозможно, либо еще немного bash маги c в моем распоряжении.

1 Ответ

1 голос
/ 08 февраля 2020

Попробуйте:

./run-as-cron "bash" "-c" "/home/me/some.sh >/folder/I/cant/write/to.log 2>&1"

Объяснение:

a) 2>&1 перенаправление должно произойти после перенаправления файла

b) Согласно https://unix.stackexchange.com/questions/42715/how-can-i-make-cron-run-a-job-right-now-for-testing-debugging-without-changing/213302#213302, run-as-cron.sh определяется как

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

Из-за «$ @» вам необходимо передать свои аргументы в качестве позиционных параметров. bash -c xxx необходимо разбить на три аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...