2017-05-25 134 views
2

我想從我的Perl程序中運行Bash命令。 然而,Perl似乎將我的Bash $ PWD環境變量作爲Perl變量混淆了。在Perl腳本中使用Bash環境變量?

我怎樣才能讓它只讀爲一個字符串?

這就是我試圖運行

my $path = /first/path; 
`ln -s $path $PWD/second/path` 

那些反引號運行在Bash的第二行。使用System()會產生同樣的問題。

任何想法?

+2

'PWD' *是由bash(和其他shell如'zsh')導出的*;使用'/ usr/bin/printenv'來驗證;這是一個*魔術*環境變量 –

+0

@BasileStarynkevitch,我站在糾正。 –

+2

使用'\ $'來轉義'$' – Arkadiy

回答

5

這裏有兩個查詢,使用Bash變量和運行外部命令。

有在Perl %ENV hash,環境變量

perl -wE'say $ENV{PWD}' 

但是,你通常能夠更好地獲取腳本中的等價物,因爲事情可能對腳本或變化作爲一個微妙的不同含義腳本運行。

更重要的是,使用shell命令會暴露出各種引用,shell注入和解釋的潛在問題。例如,您顯示的命令是危險的,如Charles Duffy評論中所述。原則上使用Perl豐富的功能更好。參見例如

爲清醒,細緻,帳戶的優點。


在你需要運行外部命令的情況下,最好是通過使用system多參數形式,以避免殼完全,例如。如果你需要命令的輸出,Perl中有各種模塊可以提供。請參閱以下鏈接。

如果您還需要使用shell的功能,而不是引用所有內容,以便shell能夠更好地使用現成的工具,如String::ShellQuote

一些例子:

注意qx operator(反引號)使用/bin/sh,這可能會或可能不會降級猛砸。所以如果你想Bash,你需要system('/bin/bash', '-c', @cmd)。查看帶有示例的鏈接。


這是一個與問題背後的目標相關的完整示例。

根據您的程序的啓動方式,您的程序的工作目錄可能不是預期的。首先,它在chdir之後改變。我不知道你的具體意圖是PWD,但是在Perl中有核心Cwd :: cwdFindBin :: $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

請注意,使用symlink時,您無法傳遞目錄而不是鏈接名稱。見this page

+0

@RyanSaffer我大大地更新了這篇文章,並給出了具體的答案。 – zdim

+0

逾期的回覆,但這幫了我很多!謝謝!! –

+0

@RyanSaffer很棒:)請讓我知道如果有更多的解釋將是有用的。 – zdim