LINUX.ORG.RU

Подстановка команд с предварительной интерпретацией строки команды

 


0

1

Так получилось (не дай бог никому), что пришлось мне править перловый скрипт, написанный хрен знает, кем. Надо добавить command substitution, чтобы вызывать внешнюю команду и класть ее вывод в переменную. Но команда не фиксированная, а строится на основе значений переменных. Пусть будет «ls -l $someDir» для примера.

В баше я бы написал просто:

result = $(ls -l $someDir)

Я узнал, что в перле есть спец. синтакс, как и в шелле, с опострофами, но предварительная интерпретация строки команды там, на сколько я понял, не работает. Так же есть примеры в инете, со стандартной техникой создания пайпа, запуска процесса и чтения из пайпа, как из файла. Но хотелось бы избежать всей этой мороки, ведь перл славен именно своими однострочниками.

Есть идеи?

★★★★★

Последнее исправление: seiken (всего исправлений: 1)

Ответ на: комментарий от seiken

$ perl -e ' $d = "/etc/cups"; \
            @s = `ls -l $d`;  \
            print @s;         \
          '

total 80
-rw------- 1 root lp     111 Mar 21 16:58 classes.conf
-rw------- 1 root lp     111 Sep 21  2021 classes.conf.O
-rw-r--r-- 1 root root 30436 Jan  8  2021 cups-browsed.conf
-rw-r--r-- 1 root root  6402 Feb  9  2020 cupsd.conf
-rw-r--r-- 1 root root  3047 May 27  2021 cups-files.conf
drwxr-xr-x 2 root root     6 Jan 19  2020 interfaces
drwxr-xr-x 2 root lp       6 Mar 21 16:49 ppd
-rw------- 1 root lp     587 Apr 10 14:49 printers.conf
-rw------- 1 root lp     587 Apr 10 12:39 printers.conf.O
-rw-r--r-- 1 root root   240 Feb  9  2020 raw.convs
-rw-r--r-- 1 root root   211 Feb  9  2020 raw.types
-rw-r--r-- 1 root root   142 Jan 19  2020 snmp.conf
drwx------ 2 root lp      42 Apr 13  2020 ssl
-rw-r----- 1 root lp      96 Apr 10 12:37 subscriptions.conf
-rw-r----- 1 root lp     414 Apr  9 17:33 subscriptions.conf.O

futurama ★★★★★
()
Ответ на: комментарий от futurama

Странно. Я это пробовал, но почему-то не работало. Возможно, забыл префикс, обозначающий имя переменной или что-то еще… Но перл не подкачал.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

он говорит что бесплатный

Как искусственный интеллект, я не имею возможности оказывать услуги или получать оплату за свои действия. Мои функции предназначены только для помощи в ответах на вопросы и общения с пользователями.
alysnix ★★★
()

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

#!/usr/bin/perl
#

use strict;
use warnings;

my $dir = './';
my $command = "ls -la $dir";
my @result = `$command`;
print @result;

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Необязательно записывать выдачу команды в массив @result, на практике часто бывает удобнее скаляр $result. Хотя для многострочных данных массив идеологически правильнее.

annulen ★★★★★
()