2013-04-21 3 views
4

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

Но для команд требуются два источника ввода, которые я бы вручную вводил при запуске команды.

Есть ли способ открыть файл, он может запросить у меня эти два входа, а затем вставить их в команду, а затем запустить команду?

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

$ cd scripts/x 
$ python x.py -i input -o output 

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

Как я могу это сделать?

ответ

2

Во-первых, создайте этот файл (x.sh) в вашем любимом редакторе:

#!/bin/bash 

# the variable $# holds the number of arguments received by the script, 
# e.g. when run as "./x.sh one two three" -> $# == 3 
# if no input and output file given, throw an error and exit 
if (($# != 2)); then 
     echo "$0: invalid argument count" 
     exit 1 
fi 

# $1, $2, ... hold the actual values of your arguments. 
# assigning them to new variables is not needed, but helps 
# with further readability 
infile="$1" 
outfile="$2" 

cd scripts/x 

# if the input file you specified is not a file/does not exist 
# throw an error and exit 
if [ ! -f "${infile}" ]; then 
     echo "$0: input file '${infile}' does not exist" 
     exit 1 
fi 

python x.py -i "${infile}" -o "${outfile}" 

Затем вам нужно, чтобы сделать его исполняемый (тип man chmod для получения дополнительной информации):

$ chmod +x ./x.sh 

Теперь вы можете запустить этот скрипт из той же папки с помощью ./x.sh, например

$ ./x.sh one 
x.sh: invalid argument count 

$ ./x.sh one two 
x.sh: input file 'one' does not exist 

$ ./x.sh x.sh foo 
# this is not really printed, just given here to demonstrate 
# that it would actually run the command now 
cd scripts/x 
python x.py -i x.sh -o foo 

Обратите внимание, что если имя файла вашего выхода как-то на основе имени входного файла, вы могли бы избежать того, чтобы указать его в командной строке, например:

$ infile="myfile.oldextension" 
$ outfile="${infile%.*}_converted.newextension" 
$ printf "infile: %s\noutfile: %s\n" "${infile}" "${outfile}" 
infile: myfile.oldextension 
outfile: myfile_converted.newextension 

Как вы можете видеть, здесь есть возможности для улучшения. Например, мы не проверяем, действительно ли существует каталог scripts/x. И если вы действительно хотите, чтобы скрипт спросил для имен файлов и не хотел указывать их в командной строке вообще, см. man read.

Если вы хотите узнать больше о сценариях командной оболочки, вы можете прочитать BashGuide и Bash Guide for Beginners в этом случае вы должны также проверить BashPitfalls.

+0

Благодарим вас за это и за разъяснение. Это было очень полезно! –

+0

Одна проблема, когда я дважды щелкаю X.sh, чтобы открыть ее, терминал открывается и закрывается (это быстрая вспышка). Я предполагаю, что это потому, что я не дал ему ввода, и он быстро печатает ошибку и закрывает. Как я могу получить терминал, чтобы открыть запрос ввода, когда файл .sh дважды щелкнут и откроется в терминале. –

+0

Как уже упоминалось, вы можете использовать 'read' для ... читать ... имена файлов со стандартного ввода (на клавиатуре). Итак, вместо того, чтобы делать 'infile =" $ 1 ", вы могли бы использовать' read infile', например. Вы бы сделали то же самое для 'outfile' и проигнорировали проверку количества аргументов в верхней части. –

0
usage() 
{ 
    echo usage: $0 INPUT OUTPUT 
    exit 
} 

[[ $2 ]] || usage 
cd scripts/x 
python x.py -i "$1" -o "$2" 
Смежные вопросы