请在底部看到我的问题。如何让助手脚本(Bash/Python/Ruby/Perl)执行一个复杂的命令?
这是命令我想在一个Perl脚本已经执行使用system()
zfs send tank/[email protected] | mbuffer -4 -O 10.10.47.47:8023
,但我得到这个错误
mbuffer: warning: error connecting to 10.10.47.47:8023: Connection refused
mbuffer: error: unable to connect to 10.10.47.47:8023
mbuffer: fatal: no output left - nothing to do
这是误导,因为我可以在执行命令一个终端,它工作正常。
所以现在我已经变得有创意,找到一种方法来解决这个限制。把命令放在一个文件中,并且做
system("ssh localhost /tmp/test");
的工作原理,但是不得不SSH到localhost并且使临时文件不好。需要ssh localhost
,否则我会得到相同的错误。
为了避免临时文件创建我试图做一个“解析器文件”
#!/usr/bin/bash
$1 | $2
这是呼叫pipe.sh
然后在Perl做
my $a = 'zfs send tank/[email protected]';
my $b = "mbuffer -4 -O 10.10.47.47:8023";
system("pipe.sh $a $b");
但pipe.sh
执行zfs | send
。
我的下一个想法是
my $c = "zfs send tank/Test0\@snap \| mbuffer -4 -O 10.10.47.47:8023";
system("pipe.sh $c");
与pipe.sh
成为
#!/usr/bin/bash
[email protected]
但这把每个作为一个单独的命令。即zfs
,然后send
等等。
问题
我已经江郎才尽了如何在不制作一个临时文件,它是坏的执行该命令,如tank/Test0
实际上是一个for循环中的变量,所以它会导致许多写道。
而不是调用一个bash脚本我打开执行Ruby或Python脚本,如果他们可以处理这比Bash更好。
更新
如果我从终端做
perl -e'system "bash", "-c", q{zfs send tank/[email protected] | mbuffer -4 -O 10.10.47.47:8023}'
那么它的工作原理,但是从剧本
system("bash", "-c", q{zfs send tank/[email protected] | mbuffer -4 -O 10.10.47.47:8023});
内做同样的给我(与mbuffer冗长5启用)
mbuffer: Verbose = 5
mbuffer: total # of phys pages: 1132576 (pagesize 4096)
mbuffer: default buffer set to 22651 blocks of 4096 bytes
mbuffer: getting address info for 10.10.47.47:8023
mbuffer: warning: error connecting to 10.10.47.47:8023: Connection refused
mbuffer: error: unable to connect to 10.10.47.47:8023
mbuffer: allocating memory for 22651 blocks with 4096 byte (90604 kB total)...
mbuffer: creating semaphores...
mbuffer: opening input...
mbuffer: direct I/O hinting failed for input: Invalid argument
mbuffer: fatal: no output left - nothing to do
更新2
这实际工作!
system("ssh", "localhost", q{zfs send tank/[email protected] | mbuffer -4 -v 5 -O 10.10.47.47:8023});
我得到以下错误最详细的启用,但工程因为某些原因。
mbuffer: Verbose = 5
mbuffer: total # of phys pages: 1130435 (pagesize 4096)
mbuffer: default buffer set to 22608 blocks of 4096 bytes
mbuffer: getting address info for 10.10.47.47:8023
mbuffer: successfully connected to 10.10.47.47:8023
mbuffer: set TCP send buffer size to 1048576
mbuffer: allocating memory for 22608 blocks with 4096 byte (90432 kB total)...
mbuffer: creating semaphores...
mbuffer: opening input...
mbuffer: direct I/O hinting failed for input: Invalid argument
mbuffer: direct I/O hinting failed for output to 10.10.47.47:8023: Invalid argument
mbuffer: checking if we have a controlling terminal...
mbuffer: registering signals...
mbuffer: starting threads...
mbuffer: checking output device...
mbuffer: no device on output stream
mbuffer: checking input device...
mbuffer: no device on input stream
mbuffer: outputThread: starting output on 10.10.47.47:8023...
mbuffer: inputThread: starting with threadid 3...
mbuffer: inputThread: last block has 2640 bytes
mbuffer: inputThread: exiting...
mbuffer: outputThread: last block has 2640 bytes
mbuffer: outputThread: syncing 10.10.47.47:8023...
mbuffer: syncing unsupported on 10.10.47.47:8023: omitted.
mbuffer: outputThread: finished - exiting...
mbuffer: waiting for senders...
mbuffer: joining sender for 10.10.47.47:8023
summary: 46.0 KiByte in 0.0 sec - average of 22.9 MiB/s
评论是不适合扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/65630/discussion-on-question-by-jasmine-lognnes-how-to-let-a-helper-script-bash- pytho)。 – 2014-11-25 18:15:26