Как правильно запустить скрипты командной строки Perl "один лайнер"?
Я просмотрел ряд руководств, но я все еще не могу понять, что я делаю неправильно. Я пытаюсь использовать код ниже (в .pl Perl файле, как исполняемый файл):
#!/usr/bin/perl
perl -e 'print "Hello";'
Я запускаю этот script и получаю:
Выполнение/home/user1/Desktop/file_backups.pl отменено из-за ошибок компиляции.
(Я новичок в использовании Perl для вызова командной строки Linux.)
Ответы
Ответ 1
perl
не является допустимой командой внутри Perl script. Если бы вы назвали этот файл как .sh script и использовали #!/bin/bash
в строке shebang, это сработало бы, но на самом деле не имеет смысла писать файл bash для вызова Perl (почему бы не вызвать Perl напрямую?)
Поскольку вы упомянули, что хотите взаимодействовать с командной строкой, я расскажу здесь, что вы можете получить параметры командной строки в Perl с помощью массива @ARGV
. (См. perldoc perlvar.)
Ответ 2
Try:
#!/usr/bin/perl
# This is a comment ~~~
# This script will be run as a Perl script
# since 'perl' isn't a keyword or function in Perl
# something like this must fail:
#
# perl -e 'print "Hello";'
#
# The following should work.
print "Hello"; print " World\n";
Или, если вы хотите, чтобы ваша оболочка script выполняла код Perl:
#!/bin/sh
# That a Bash script ~~~
# It just a command line in a file ...
perl -e 'print "Hello World";'
Фон: #!
- это директива интерпретатора.
Когда команда выполняется, она преобразуется в выполнение интерпретатора.
Ответ 3
Просто введите в командной строке (не в файле)
perl -e 'print "Hello World\n";'
Это действительно хорошо для oneliners. Более длинные скрипты нуждаются в собственном файле...
Ответ 4
Это должно сработать. Двойные кавычки за пределами одиночных кавычек внутри;)
perl -e "print 'Hello'"
Ответ 5
Возможно, вы попытаетесь сделать это:
system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");
Ответ 6
Поскольку вы сказали, что ищете противоположное, это может быть то, что вы имеете в виду:
# vi stdin.pl
# cat stdin.pl
#!/usr/bin/perl
while(<STDIN>)
{
if( /^hello/ ){ print "Hello back to ya!\n"; }
}
# chmod 0777 stdin.pl
# ./stdin.pl
foo
hello
Hello back to ya!
#
Ответ 7
Скажем, у вас есть следующие входы:
$ for i in a b c ; do echo "$i is $i" > $i; done
$ cat a b c
a is a
b is b
c is c
Все знают, что заглавные буквы намного лучше!
perl -i.bak -pe '$_ = uc' a b c
Итак, теперь
$ cat a b c
A IS A
B IS B
C IS C
Но мы действительно хотели бы это сделать в команде под названием upcase
, и это легко сделать!
#! /usr/bin/perl -pi.bak
$_ = uc
Посмотрите на работу:
$ for i in a b c ; do echo "$i is $i" > $i; done
$ cat a b c
a is a
b is b
c is c
$ ./upcase a b c
$ !cat
cat a b c
A IS A
B IS B
C IS C
Дополнительные советы от ответа на аналогичный вопрос:
Параметр -e
вводит исполняемый код Perl, который вы можете представить как script в командной строке, поэтому отпустите его и вставьте код в тело. Оставьте -p
в строке shebang (#!
).
В целом, безопаснее всего придерживаться "скопления" опций в строке shebang. Если вам нужно больше, вы всегда можете выбросить их эквиваленты внутри блока BEGIN {}
.
Не забудьте включить бит выполнения!
chmod +x script-name
Поскольку вы не дали фактический однострочный конвертер, который хотите преобразовать, я должен был дать общий общий ответ. Если вы отредактируете свой вопрос, чтобы указать его на то, что вы хотите сделать, мы можем дать более полезные ответы.