Các backticks gọi một vỏ. Vỏ xử lý #
và mọi thứ sau khi nó là bình luận.
Bạn cần trích dẫn chính xác các giá trị được nội suy để shell không bị nhầm lẫn, bất kể chuỗi ký tự của bạn có chứa ký tự nào (ví dụ: dấu ngoặc đơn, dấu ngoặc kép, dấu gạch ngang, dấu thăng, dấu gạch chéo, dấu gạch chéo ngược, et cetera).
Bạn có thể sử dụng một phụ trợ như thế này:
sub sq ($) {
# Bourne-style single quote $_[0]
# e.g.
# foo bar becomes 'foo bar'
# a'b becomes 'a'\''b'
# The following implementation does not yield the most compact
# representations, but it is dead simple.
my $sq = $_[0];
$sq =~ s/'/'\\''/g;
"'$sq'";
}
$execute=`ssh -q id@host /usr/message/send -pin @{[sq $pager_num]} -message @{[sq $message]}`;
Nếu bạn không quan tâm đến tất cả nhiễu ở giữa chuỗi lệnh của mình, thì bạn có thể sử dụng một số biến phụ:
my $sq_pager_num = sq $pager_num;
my $sq_message = sq $message;
$execute=`ssh -q id@host /usr/message/send -pin $sq_pager_num -message $sq_message`;
Nhưng điều đó chỉ giải quyết vấn đề cho vỏ cục bộ . Bởi vì bạn đang sử dụng ssh , một shell trên hệ thống từ xa cũng sẽ diễn giải các chuỗi của bạn. Vì vậy, bạn thực sự cần phải trích dẫn chúng hai lần .
my $tsq_pager_num = sq sq $pager_num;
my $tsq_message = sq sq $message;
$execute=`ssh -q id@host /usr/message/send -pin $tsq_pager_num -message $tsq_message`;
Thay thế cho việc sử dụng shell cục bộ (và phải trích dẫn cho nó), bạn có thể chạy lệnh cục bộ ( ssh ) trực tiếp bằng cách sử dụng mẫu đối số 4+ của open
:
open CMD, '-|', qw(ssh -q id@host /usr/message/send -pin), sq $pager_num, '-message', sq $message;
{ local $/; $execute = <CMD>; }
close CMD;