我可以在我的終端中成功執行下面的命令。
命令:
gdalwarp -s_srs " datum=WGS84 no_defs geoidgrids=egm96-15.gtx" -t_srs " datum=WGS84 no_def" input.tif output.tif
現在,我想將此命令存盤到一個變數中,并在 docker 容器中展開此命令。
我的腳本run.sh如下所示。我首先將目標命令存盤到mycommand容器中并使用命令作為輸入運行容器。
mycommand=$@;
docker run -ti --rm osgeo/gdal:ubuntu-small-latest /bin/bash -c "cd $(pwd); ${mycommand}"
然后我執行run.sh如下。
bash run.sh gdalwarp -s_srs " datum=WGS84 no_defs geoidgrids=egm96-15.gtx" -t_srs " datum=WGS84 no_def" input.tif output.tif
問題:
- 我希望之后的所有內容都
bash run.sh可以直接存盤到mycommand變數中。 - 在 docker 容器內,
mycommand可以按字面意思擴展和執行。但是看起來我原來命令中的雙引號在這個程序中會丟失。
謝謝你。
uj5u.com熱心網友回復:
您可以將命令作為引數傳遞,然后"$@"在 shell 內呼叫。我更喜歡單引號。
docker run -ti --rm osgeo/gdal:ubuntu-small-latest \
/bin/bash -c 'cd '"$(pwd)"' && "$@"' -- "$@"
如果您cd只想讓 docker 使用-w. 在 Bash 中$PWD會比pwd命令更快。
docker run ... -w "$PWD" image "$@"
請注意,"$(pwd)"在子 shell 中沒有正確參考 - 結果將進行分詞和檔案名擴展。無論如何,我推薦declare -p和 Bash 陣列(和declare -f函式)在 Bash-es 之間傳輸資料。declare將始終正確參考所有內容,以便子 shell 可以正確匯入它。
cmd=("$@")
pwd=$PWD
work() {
cd "$pwd"
"${cmd[@]}"
}
docker ... bash -c "$(declare -p pwd cmd); $(declare -f work); work"
研究:何時在 shell 中使用參考、單引號和雙引號之間的區別、分詞擴展以及如何防止它,https ://mywiki.wooledge.org/Quotes,bash 陣列,https://mywiki.wooledge.org/ BashFAQ/050。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/404408.html
標籤:
