我對 perl (v5.26.3) 命令 system 或 exec 有疑問(兩者的行為相同)
兩個命令都可以正常作業
system ('git','pull','-ff','--no-rebase');
system ('git submodule --quiet foreach --recursive "echo \${name}"');
但是當我將“git子模塊”拆分為引數時:
system ('git','submodule','--quiet foreach','--recursive "echo \${name}"');
Perl 回傳:
usage: git submodule [--quiet] [--cached]
or: git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
or: git submodule [--quiet] status [--cached] [--recursive] [--] [<path>...]
or: git submodule [--quiet] init [--] [<path>...]
or: git submodule [--quiet] deinit [-f|--force] (--all| [--] <path>...)
or: git submodule [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...]
or: git submodule [--quiet] set-branch (--default|--branch <branch>) [--] <path>
or: git submodule [--quiet] set-url [--] <path> <newurl>
or: git submodule [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
or: git submodule [--quiet] foreach [--recursive] <command>
or: git submodule [--quiet] sync [--recursive] [--] [<path>...]
or: git submodule [--quiet] absorbgitdirs [--] [<path>...]
我怎樣才能傳遞論點?
uj5u.com熱心網友回復:
對于需要一個串列的系統呼叫,我們需要將分解成單詞的命令傳遞給它
如果 LIST 中有多個引數,或者如果 LIST 是一個具有多個值的陣列,則以串列的其余部分給出的引數啟動串列的第一個元素給出的程式。如果只有一個標量引數,則檢查該引數的 shell 元字符,如果有,則將整個引數傳遞給系統的命令 shell 進行決議(這
/bin/sh -c在 Unix 平臺上,但在其他平臺上有所不同)。如果引數中沒有 shell 元字符,則將其拆分為單詞并直接傳遞給execvp, ...
(我的重點)?
讓我們看一個簡單的例子。采取類似的命令
ls -l --sort size dir "dir A"
并將其分解,以便將“引數”串列傳遞給“命令”。沒有命令ls -l,但有ls和它的論點-l。也沒有論據--sort size;有--sort論據,和 (它的價值) size。但是受引號保護的東西,例如"dir A",需要作為一個“令牌”傳遞。所以:('ls', '-l', '--sort', 'size', 'dir', 'dir A')
與'--quiet foreach'- 那是什么論據,說git?
所以,不知道那個git命令,我會去
system('git', 'submodule', '--quiet', 'foreach', '--recursive', '"echo \${name}"');
我將保持"echo \${name}"原樣,因為我不知道這意味著什么。但這很可能需要以不同的方式寫,請澄清。?
?見man 3 exec。
但是,一旦它決議了給它的一行,看看 shell (bash) 是如何做到這一點的,它也是有啟發性的,也許更容易理解。它是鏈接的 wiki 頁面上的“第 6 步”,最后準備將命令傳遞給程式。
?考慮一下- 感謝ikegami您的評論- 目前尚不清楚,雖然它確實很重要,但假定$name 的變數是什么以及......它屬于誰。它是否需要在某個階段進行推斷,還是git需要按git原樣傳遞?
這不會影響此答案的總體要點:將命令分解為單詞以通過 LIST 傳遞給system' 呼叫。這意味著基本上用空格來打破它,除了空格被轉義的部分(就像它實際上是用引號一樣)。
(另請參閱exec頁面,至少在只有一個引數但我們仍想避免使用 shell 的情況下如何使用 LIST 呼叫。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/418209.html
標籤:
