2010-05-13 5 views
0

Больше, чем проблема, это запрос на «другой способ сделать это».shell scripting: inested subshell ++

На самом деле, если я хочу использовать результат предыдущей команды в другой, я использую:

R1=$("cat somefile | awk '{ print $1 }'") 
myScript -c $R1 -h123 

тогда, «лучшим способом» является:

myScript -c $("cat somefile | awk '{ print $1 }'") -h123 

Но что, если Я должен использовать результат несколько раз? Скажем: используя несколько раз $R1, а в 2 опции:

Вариант 1

R1 = $ ("кошка некий-файл | AWK '{печать $ 1}'")

myScript -c $R1 -h123 -x$R1 

вариант 2

myScript -c $("cat somefile | awk '{ print $1 }'") -h123 -x $("cat somefile | awk '{ print $1 }'") 

вы знаете другой способ «магазин» результат предыдущей команды/сценарий и использовать его в качестве аргумента в другую команду/скрипт?

+0

Что именно проблема с Вашим первым предложением?Вы должны исправить цитату: 'R1 = $ (awk '{print $ 1}' somefile) myScript -c" $ R1 "-h123' , но кроме этого все в порядке. – Philipp

+0

вариант 2 не очень хорош, так как вы выполняете внешние команды дважды (производительность hurrting), и не гарантируется, что во второй раз вы получите тот же результат – dimba

+0

Вы просите способ сохранить результат, кроме сохранения его в переменной? – Cascabel

ответ

0

Несомненно, есть и другие способы. Они просто не лучшие способы.

Во-первых, вы можете сохранить ответ в файле, а затем котировать содержимое файла несколько раз.

Во-вторых, вы могли бы передать результаты функции Баш как:

callMyScript() { 
    myScript -c "$1" -h123 -x "$1" 
} 

вызван таким образом:

callMyScript "$(awk '{ print $1; }' somefile)" 

, который почти точно совпадает с только экономия от в локальную переменную.

Итак, вы заинтересованы в использовании awk? Вы могли бы генерировать AWK линию для вас, и есть Баш запустить его:

eval $(awk '{ printf "myScript -c %s -h123 -x %s\n", $1, $1; }' somefile) 

но теперь мы только глупо, и даже то, что ничем не отличается концептуально от простого сохранения прочь в переменной.

Мой совет: Используйте переменную.

0

Еще не идеальный способ:

источник сценария # 1, а затем, когда сценарий # 2 работает все переменные, объявленные в # 1 доступны # 2.

#!/bin/ksh 
. myScript -c $("cat somefile | awk '{ print $1 }'") -h123 
myScript2 

Ваш лучший выбор - это скрипт-оболочка, который хранит все ваши переменные для вас, как и все остальные.

В Баш источник встроенная команда такая же, как «точка»