第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從帶有參數的字符串運行命令

從帶有參數的字符串運行命令

Go
搖曳的薔薇 2023-05-08 16:08:01
我正在嘗試使用 go 運行命令。命令在一個字符串中。package mainimport (    "log"    "os"    "os/exec"    "strings"    "github.com/davecgh/go-spew/spew")func main() {    commandToRun := `echo $HOME`    log.Printf("Running %s\n", commandToRun)    args := strings.Fields(commandToRun)    spew.Dump(args[1:len(args)])    command := exec.Command(args[0], args[1:len(args)]...)    command.Stdout = os.Stdout    command.Stdin = os.Stdin    command.Stderr = os.Stderr    err := command.Run()    if err != nil {        log.Printf("Command finished with error: %v", err)    }}輸出是:2018/11/14 09:41:22 Running echo $HOME([]string) (len=1 cap=1) { (string) (len=5) "$HOME"}$HOME我想要的是:2018/11/14 09:41:22 Running echo $HOME([]string) (len=1 cap=1) { (string) (len=5) "$HOME"}/home/whatever看起來 go 正在以某種方式清理字符串。所以$HOME沒有展開。有什么方法可以像在 shell 中輸入一樣運行字符串嗎?這是重要的部分。理想情況下,我想在當前 shell 中從字符串轉為類型。編輯:下面的例子解決了最簡單的場景,但沒有涵蓋“運行字符串就好像它被輸入到 shell 中一樣”部分。如果我切換到expandenv:commandToRun := os.ExpandEnv(`echo "$HOME"`)我得到:2018/11/14 11:45:44 Running echo "/Users/rafael"([]string) (len=1 cap=1) { (string) (len=15) "\"/home/whatever\""}"/home/whatever"我在 shell 中得到的是:$ > echo "$HOME"/home/whatever沒有引號。這接近我想要的,但不完全是。
查看完整描述

4 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

$HOME(以及所有其他環(huán)境變量)由 shell 擴展。您沒有執(zhí)行 shell,因此它們不會擴展。


您需要直接在 go 中查找 env 變量,例如:


command := exec.Command("echo", os.Getenv("HOME"))

或這個:


commandToRun := os.ExpandEnv("echo $HOME")

args := strings.Fields(commandToRun)

command := exec.Command(args[0], args[1:]...)

$HOME請注意,如果擴展為包含空格的字符串,最后一種方法將不起作用,因此該os.Getenv方法通常更安全/更適合此用例。


查看完整回答
反對 回復 2023-05-08
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

在執(zhí)行命令之前,您可以使用以下方式主動擴展字符串中的所有環(huán)境變量os.ExpandEnv

os.ExpandEnv("echo?$HOME")

從文檔:

ExpandEnv 根據當前環(huán)境變量的值替換字符串中的${var} 或$var。對未定義變量的引用將替換為空字符串。


查看完整回答
反對 回復 2023-05-08
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

如果您想獲得 的輸出$ echo $HOME,您需要的最少代碼是

fmt.Println(os.Getenv("HOME"))

不需要更多了。

  • 如果你使用os.ExpandEnv("echo $HOME"),那么首先$HOMEvar 將被擴展然后它會給你一個像這樣的字符串echo /home/<user>

  • 如果您使用command := exec.Command("echo", os.Getenv("HOME")), 那么它將被解析為command := exec.Command("echo", "/home/<user>")finally 這將給出輸出/home/<user>

  • 如果你使用

    commandToRun := os.ExpandEnv("echo $HOME") command := exec.Command(strings.Fields(commandToRun)...)

    那么它將像以前的案例一樣處理。

所以更好的方法是只使用fmt.Println(os.Getenv("HOME")).


查看完整回答
反對 回復 2023-05-08
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

您需要運行一個 shell。在 Go 中擴展它似乎很愚蠢并且容易出錯,因為你有一個可以運行的 shell。

commandToRun := `echo "$SHELL"`
cmd := exec.Command("/bin/sh", "-c", commandToRun)
command := exec.Command(args[0], args[1:len(args)]...)
command.Stdout = os.Stdout
command.Stdin = os.Stdin
command.Stderr = os.Stderr
err := command.Run()

這應該適用于任何 POSIX 系統(tǒng)。今天的孩子們在他們的命令行中加入了很多 bashisms,因此您可以將其切換為運行,/bin/bash但請注意,這在 FreeBSD 或其他一些系統(tǒng)(其他 BSD 及其派生系統(tǒng))上不起作用。


查看完整回答
反對 回復 2023-05-08
  • 4 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號