我想在 perl 腳本中檢查我的機器(RedHat)上是否存在命令。
我試圖檢查是否compgen -c包含所需的命令,但從腳本內部運行它只會給我一個空輸出。其他命令作業正常。
例子.pl:
my $x = `compgen -c`;
print $x;
# empty output
my $y = `ls -a`;
print $y;
# .
# ..
# example.pl
有沒有可能的解決方案?或者有沒有更好的方法來檢查我機器上的命令?
uj5u.com熱心網友回復:
首先,Perl 使用 運行外部命令/bin/sh,現在它是指向 shell 的鏈接,它是系統上的默認排序。大部分時間是bash,但并非總是如此;在 RedHat 上是這樣。
這compgen是一個 bash 內置。發現這一點的一種方法是運行man compgen(在 bash 中)——然后bash彈出手冊。另一種方式是type如戴夫所示。
要使用內置函式,我們通常需要為它們運行顯式 shell,并且它們在 shell 是否“互動式”方面具有不同的行為。?我在這個內置的 bash 檔案中找不到對此的討論,但實驗表明你需要
my @completions = qx(bash -c "compgen -c")
需要引號以便將完整的命令傳遞給將要啟動的 shell。
請注意,這樣您就不會STDERR從這些命令中捕獲任何內容。這將在終端上顯示,并且可能會被錯過。或者,您可以通過在命令末尾添加2>&1(redirect to ) 在命令中重定向該流。STDOUT
這是使用許多好的庫之一來運行和管理外部命令而不是內置的“反引號”的原因之一(我上面使用的qx是它的運算子形式。)
?這可以通過-i
my @output_lines = qx(bash -i -c "command with arguments")
uj5u.com熱心網友回復:
這是因為compgen是bash內置命令,而不是外部命令。當您使用反引號運行命令時,您將獲得系統的默認 shell - 這可能是/bin/sh,而不是bash.
解決方案是顯式運行bash,使用-c命令列選項給它一個運行命令。
my $x = `bash -c compgen -c`;
在bash提示符下,您可以使用type來查看命令是如何實作的。
$ type ssh
ssh is /usr/bin/ssh
$ type compgen
compgen is a shell builtin
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521569.html
