Простой вопрос перенаправления Unix: передача строк в файле в качестве аргументов командной строки в скрипт - PullRequest
3 голосов
/ 22 августа 2011

Хорошо, мои навыки работы с Unix-скриптами, очевидно, действительно ржавые. Все, что я хочу сделать, это иметь файл с 4 аргументами, которые я хочу передать в скрипт, как если бы они пришли из командной строки. Но странно делать это:

./myscript.sh < mycmds.txt

Кажется, не работает так, как я ожидаю. Содержимое myscript.sh:

cat >> out.txt <<EOF
$1 $2 $3 $4
EOF

Так что, если я запускаю myscript.sh из командной строки следующим образом: ./myscript.sh test1 test2 test3 test4 все отлично работает, и я вижу test1 test2 test3 test4 в файле out.txt. Но если я добавлю test1 test2 test3 test4 в виде строки в файл mycmds.txt, а затем запусту ./mysript.sh < mycmds.txt, я получу пустую строку в файле out.txt.

Так, что я здесь не так делаю? Как правильно хранить аргументы в файле и передавать их в сценарий, чтобы они обрабатывались так же, как если бы они были получены из командной строки?

Ответы [ 3 ]

6 голосов
/ 22 августа 2011

Чтобы сделать содержимое mycmds.txt доступным в качестве параметров командной строки, просто вставьте содержимое при вызове myscript.sh:

./myscript.sh $(< mycmds.txt)
1 голос
/ 22 августа 2011

Это потому, что < является перенаправлением ввода и отправляет эту строку в качестве стандартного ввода процессу, никак не касаясь аргументов командной строки.

Вы можете сделать что-то вроде:

./myscript.sh $(cat mycmds.txt)

Конструкция $(xyz) запускает xyz, а затем использует свой стандартный вывод для построения этой части команды.Например:

ls $(expr 1 + 3)

попытается дать вам прямой список для файла с именем 4 следующим образом.

Сначала выполняется команда expr 1 + 3 и вывод 4.Затем он подставляется во внешнюю команду, чтобы дать вам ls 4, и она выполняется.

0 голосов
/ 25 августа 2011

Тонкость, которую вы упускаете, состоит в том, что стандартные входные и позиционные параметры не одно и то же.

Стандартный ввод, который вы можете перенаправить с помощью «<» или даже из другой программы с «|» это последовательность байтов. Скрипт может читать stdin с помощью команды <code>read.

Позиционные параметры пронумерованы от 1 до N и содержат значение каждого аргумента. Оболочка именует их от $ 1 до $ {42} (если вы дали столько).

Стандартные входные и позиционные параметры не зависят друг от друга. Вы можете иметь и то, и другое или ни одного, в зависимости от того, как вы называете программу (и что ожидает эта программа):

  1. Оба: grep -E pattern < file
  2. Просто stdin: wc < file
  3. Только позиционные параметры: echo Here are five positional parameters
  4. Ни то, ни другое: ls
...