Я пытался оптимизировать некоторые запросы импорта Neo4j за последние пару дней, и как часть выполненного мной скрипта я хотел перенаправить вывод нескольких команд в файл для последующего анализа.
Я начал со следующего скрипта, который не делает явного перенаправления вывода:
|
1
2
3
|
#!/bin/sh ./neo4j-community-2.2.3/bin/neo4j start |
Теперь давайте запустим этот скрипт и перенаправим вывод в файл:
|
1
2
3
4
5
6
7
|
$ ./foo.sh > /tmp/output.txtUnable to find any JVMs matching version "1.7". $ cat /tmp/output.txtStarting Neo4j Server...WARNING: not changing userprocess [48230]... waiting for server to be ready.... OK.http://localhost:7474/ is ready. |
Таким образом, строка о том, что не найдено подходящей JVM, выводится в stderr. Это довольно легко исправить:
|
1
2
3
|
#!/bin/sh ./neo4j-community-2.2.3/bin/neo4j start 2>&1 |
Давайте снова запустим скрипт:
|
1
2
3
4
5
6
7
|
$ ./foo.sh > /tmp/output.txt $ cat /tmp/output.txtUnable to find any JVMs matching version "1.7".Starting Neo4j Server...WARNING: not changing userprocess [47989]... waiting for server to be ready.... OK.http://localhost:7474/ is ready. |
Отлично, это сработало, как и ожидалось. Затем я расширил скрипт, чтобы остановить Neo4j, удалить все его данные, запустить его снова и выполнить скрипт cypher:
|
1
2
3
4
5
6
|
#!/bin/sh ./neo4j-community-2.2.3/bin/neo4j start 2>&1rm -rf neo4j-community-2.2.3/data/graph.db/./neo4j-community-2.2.3/bin/neo4j start 2>&1time ./neo4j-community-2.2.3/bin/neo4j-shell --file foo.cql 2>&1 |
Давайте запустим этот скрипт и перенаправим вывод:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
$ ./foo.sh > /tmp/output.txtUnable to find any JVMs matching version "1.7". real 0m0.604suser 0m0.334ssys 0m0.054s $ cat /tmp/output.txtUnable to find any JVMs matching version "1.7".Another server-process is running with [50614], cannot start a new one. Exiting.Unable to find any JVMs matching version "1.7".Another server-process is running with [50614], cannot start a new one. Exiting.+---------+| "hello" |+---------+| "hello" |+---------+1 row4 ms |
Похоже, перенаправление нашего stderr -> stdout на последней строке не сработало. Насколько я понимаю, команда ‘time’ поглощает все последующие аргументы, тогда как мы хотим, чтобы перенаправление выполнялось впоследствии.
Мы можем обойти эту проблему, поместив фактическую команду в блок кода и перенаправив вывод этого:
|
1
2
3
4
5
6
|
#!/bin/sh ./neo4j-community-2.2.3/bin/neo4j start 2>&1rm -rf neo4j-community-2.2.3/data/graph.db/./neo4j-community-2.2.3/bin/neo4j start 2>&1{ time ./neo4j-community-2.2.3/bin/neo4j-shell --file foo.cql; } 2>&1 |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
$ ./foo.sh > /tmp/output.txt $ cat /tmp/output.txtUnable to find any JVMs matching version "1.7".Another server-process is running with [50614], cannot start a new one. Exiting.Unable to find any JVMs matching version "1.7".Another server-process is running with [50614], cannot start a new one. Exiting.Unable to find any JVMs matching version "1.7".+---------+| "hello" |+---------+| "hello" |+---------+1 row4 ms real 0m0.615suser 0m0.316ssys 0m0.050s |
Намного лучше!
| Ссылка: | Unix: Перенаправление stderr на стандартный вывод от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |