2014-12-03 11 views
1

根據「perltrap」中C程序員的章節以及我所搜索的所有內容,我應該使用「$ 0」來獲取Perl中的程序名稱。然而,當我運行下面的 「來電顯示」 腳本:如何在perl中獲取程序名稱

#!/usr/bin/perl 

exec{"./called"}("name", "arg"); 

本身調用下面的 「所謂的」 腳本:

#!/usr/bin/perl 

print("$0 $ARGV[0]\n"); 

我得到 「./called arg」,而不是!

如果我把下面的 「called.c」 程序,而不是從 「主叫方」:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
     printf("%s %s\n", argv[0], argv[1]); 
     return 0; 
} 

我得到預期 「name arg」。

有沒有辦法獲得腳本名稱,而不是路徑?

+0

不知道我明白你的觀點。如果你從Perl中調用'printf'%s%s \ n「,$ ARGV [0],$ ARGV [1]',你還會得到程序的第一個和第二個參數。我相信如果你試圖從C中「調用」字符串「被調用」,你會得到和Perl一樣的結果。你認爲你的代碼應該做什麼? – TLP 2014-12-03 09:56:17

+0

你想完成什麼? $ 0指的是命令行參數 - 因爲你用'./ called'的'command'開始了你的腳本,那麼這就是第一個參數。 – Sobrique 2014-12-03 10:00:07

+0

不,我試過你的代碼,我得到的是「'arg'」,而不是''name arg'「。看到我對M42的回答,瞭解我想要做的事情。 – airman 2014-12-03 10:07:46

回答

0

一些測試,使用bash,Python和甚至自定義腳本解釋後,我發現的家當機制將不會傳播「的argv [0]」的解釋器,但會將shebang之後的路徑用作解釋器的「argv [0]」。我想這是C程序的一個功能,不能在腳本中模擬。

0

使用basename核心模塊:

use File::Basename; 
my $script_name = basename($0); 
+0

不需要。因此,我只是得到「'arg'」而不是「'./called arg'」。我期望的是「'arg'」,就像在C. – airman 2014-12-03 09:29:39

+0

@airman:在你的例子中,腳本的名字是'called'而不是'name'。 – Toto 2014-12-03 09:34:08

+0

我稱之爲「名稱」的是由執行它的過程賦予腳本的名稱。這並不總是等於路徑的基名(至少在Unix平臺上,我不知道它是如何在Windows上)。當您需要使用一個可執行文件來實現一系列命令時,這非常有用。你只需要添加符號鏈接。 – airman 2014-12-03 09:43:45

相關問題