Неожиданный вывод из скрипта bash при запуске в CGI в apache, а не при запуске через командную строку Как воспроизвести ошибку apache-only? - PullRequest
0 голосов
/ 03 февраля 2012

Я выполняю миграцию устаревшего скрипта bash, который работает на сервере www. Я столкнулся с проблемой, которую не могу объяснить.

При запуске через веб-сервер (в качестве скрипта, включенного в CGI) выполняются следующие команды:

#!/bin/bash
set -e -u
echo "BP: Statistics generation 1" >/dev/fd/2
echo "BP: one: $1, two: $2" >/dev/fd/2

more ../download/interactions.$1.$2 | grep -v "#" | awk '($2!~/_R/){print $2}' | sort -k 1 | uniq > rna.names.txt
more ../download/interactions.$1.$2 | grep -v "#" | awk '($1!~/_R/){print $1}' | sort -k 1 | uniq > protein.names.txt

Файл protein.names.txt выглядит следующим образом:

../download/interactions.3424.asdfjj
507-558_1
::::::::::::::

Середина - ожидаемый результат, но первая и последняя строки - нет. Ни один из них не содержится в файле взаимодействия.x.y, который в начале содержит только заголовок, описывающий столбцы и данные. Тест grep показывает, что данные отсутствуют.

Самое странное, что если я войду в систему на той же машине и запущу скрипт из терминала (даже если он использует www-данные), вывод будет просто средней строкой, как и должно быть.

Я пытался экспортировать env и set из bash непосредственно перед указанной командой и повторно импортировать их перед запуском скрипта, пытающегося воссоздать то, что происходит на сервере, но безрезультатно.

Сам скрипт не вызывается напрямую, есть включенный в CGI perl-скрипт, выполняющий системный вызов для запуска скрипта через bash.

Что является источником этого выхода? Как я могу хотя бы воспроизвести его?

1 Ответ

2 голосов
/ 03 февраля 2012

Нет необходимости использовать more, и это, вероятно, источник ':::', который вы получаете. more - это пейджинговое средство, и оно ожидает нажатия клавиши (может быть, пробел), чтобы сказать ему «показать следующую страницу». В этом контексте ваш скрипт не дает никаких данных, чтобы сохранить движение данных. Я предполагаю здесь, но ':' - быстрый символ.

Супер-короткий путь - дать grep имя файла, т.е.

grep -v "#" ../download/interactions.$1.$2 | awk '($2!~/_R/){print $2}' | sort -k 1 | uniq > rna.names.txt

Или, если у вас есть менеджер с подозрением на изменения,

cat ../download/interactions.$1.$2 | grep -v "#" | awk '($2!~/_R/){print $2}' | sort -k 1 | uniq > rna.names.txt

Наконец, наиболее эффективным решением будет

   awk '($0 !~ /#/ && $2 !~ /_R/){print $2}' ../download/interactions.$1.$2 | sort -u -k > rna.names.txt

(я не думаю, что вам нужно () вокруг вашего $ 2! ~ / _R / test.)

Надеюсь, это поможет.

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