我想從我的Perl程序中運行Bash命令。 然而,Perl似乎將我的Bash $ PWD環境變量作爲Perl變量混淆了。在Perl腳本中使用Bash環境變量?
我怎樣才能讓它只讀爲一個字符串?
這就是我試圖運行
my $path = /first/path;
`ln -s $path $PWD/second/path`
那些反引號運行在Bash的第二行。使用System()會產生同樣的問題。
任何想法?
我想從我的Perl程序中運行Bash命令。 然而,Perl似乎將我的Bash $ PWD環境變量作爲Perl變量混淆了。在Perl腳本中使用Bash環境變量?
我怎樣才能讓它只讀爲一個字符串?
這就是我試圖運行
my $path = /first/path;
`ln -s $path $PWD/second/path`
那些反引號運行在Bash的第二行。使用System()會產生同樣的問題。
任何想法?
這裏有兩個查詢,使用Bash變量和運行外部命令。
有在Perl %ENV
hash,環境變量
perl -wE'say $ENV{PWD}'
但是,你通常能夠更好地獲取腳本中的等價物,因爲事情可能對腳本或變化作爲一個微妙的不同含義腳本運行。
更重要的是,使用shell命令會暴露出各種引用,shell注入和解釋的潛在問題。例如,您顯示的命令是危險的,如Charles Duffy評論中所述。原則上使用Perl豐富的功能更好。參見例如
爲清醒,細緻,帳戶的優點。
在你需要運行外部命令的情況下,最好是通過使用system多參數形式,以避免殼完全,例如。如果你需要命令的輸出,Perl中有各種模塊可以提供。請參閱以下鏈接。
如果您還需要使用shell的功能,而不是引用所有內容,以便shell能夠更好地使用現成的工具,如String::ShellQuote。
一些例子:
How to use both pipes and prevent shell expansion in perl system function?
Perl is respecting '<' as a regular character rather an output redirection
Perl system command with multiple parameters output to file。
注意qx operator(反引號)使用/bin/sh
,這可能會或可能不會降級猛砸。所以如果你想Bash,你需要system('/bin/bash', '-c', @cmd)
。查看帶有示例的鏈接。
這是一個與問題背後的目標相關的完整示例。
根據您的程序的啓動方式,您的程序的工作目錄可能不是預期的。首先,它在chdir
之後改變。我不知道你的具體意圖是PWD
,但是在Perl中有核心Cwd :: cwd
和FindBin :: $RealBin
。
要創建符號鏈接$path
,相對路徑下的當前工作目錄
use warnings;
use strict;
use Cwd qw(cwd);
my $cwd = cwd;
my $path = '/first/path';
symlink($path, "$cwd/second/path") or die "Can't make a symlink: $!";
如果路徑,就是要腳本的位置使用FindBin::$RealBin
代替cwd
。
'PWD' *是由bash(和其他shell如'zsh')導出的*;使用'/ usr/bin/printenv'來驗證;這是一個*魔術*環境變量 –
@BasileStarynkevitch,我站在糾正。 –
使用'\ $'來轉義'$' – Arkadiy