Saya memiliki skrip Bash yang membangun string untuk dijalankan sebagai perintah
Naskah:
#! /bin/bash
matchdir="/home/joao/robocup/runner_workdir/matches/testmatch/"
teamAComm="`pwd`/a.sh"
teamBComm="`pwd`/b.sh"
include="`pwd`/server_official.conf"
serverbin='/usr/local/bin/rcssserver'
cd $matchdir
illcommando="$serverbin include='$include' server::team_l_start = '${teamAComm}' server::team_r_start = '${teamBComm}' CSVSaver::save='true' CSVSaver::filename = 'out.csv'"
echo "running: $illcommando"
# $illcommando > server-output.log 2> server-error.log
$illcommando
yang tampaknya tidak memasok argumen dengan benar ke $serverbin
.
Output skrip:
running: /usr/local/bin/rcssserver include='/home/joao/robocup/runner_workdir/server_official.conf' server::team_l_start = '/home/joao/robocup/runner_workdir/a.sh' server::team_r_start = '/home/joao/robocup/runner_workdir/b.sh' CSVSaver::save='true' CSVSaver::filename = 'out.csv'
rcssserver-14.0.1
Copyright (C) 1995, 1996, 1997, 1998, 1999 Electrotechnical Laboratory.
2000 - 2009 RoboCup Soccer Simulator Maintenance Group.
Usage: /usr/local/bin/rcssserver [[-[-]]namespace::option=value]
[[-[-]][namespace::]help]
[[-[-]]include=file]
Options:
help
display generic help
include=file
parse the specified configuration file. Configuration files
have the same format as the command line options. The
configuration file specified will be parsed before all
subsequent options.
server::help
display detailed help for the "server" module
player::help
display detailed help for the "player" module
CSVSaver::help
display detailed help for the "CSVSaver" module
CSVSaver Options:
CSVSaver::save=<on|off|true|false|1|0|>
If save is on/true, then the saver will attempt to save the
results to the database. Otherwise it will do nothing.
current value: false
CSVSaver::filename='<STRING>'
The file to save the results to. If this file does not
exist it will be created. If the file does exist, the results
will be appended to the end.
current value: 'out.csv'
jika saya hanya menempelkan perintah /usr/local/bin/rcssserver include='/home/joao/robocup/runner_workdir/server_official.conf' server::team_l_start = '/home/joao/robocup/runner_workdir/a.sh' server::team_r_start = '/home/joao/robocup/runner_workdir/b.sh' CSVSaver::save='true' CSVSaver::filename = 'out.csv'
(dalam output setelah "runnning:") berfungsi dengan baik.
bash
shell
command-line-arguments
João Portela
sumber
sumber
echo | whateverCommands
bukan hanyawhateverCommands
(misalnya, saya harus melakukannya seperti ini:| tail -`echo | whateverCommands`
)Jawaban:
Anda dapat menggunakan
eval
untuk mengeksekusi string:sumber
eval
adalah perintah jahat dalam semua bahasa pemrograman jadi gunakan dengan hati-hati.eval "$illcommando"
, dengan tanda kutip , agar perintah Anda tidak hancur sebelum dijalankan. Cobaeval
dengan nilaiillcommando='printf "%s\n" " * "'
dengan dan tanpa tanda kutip untuk melihat perbedaannya."${PIPESTATUS[@]}"
variabel dalam bash dengan benar. Namun,set -o pipefail
apakah benar menyebabkaneval
untuk mengembalikan kode keluar gagal jika perintah berisi perintah gagal disalurkan ke perintah yang berhasil.grep -E '$filter' unfiltered.txt > filtered.txt
, saya tidak tahu mengapa itu bekerja pada baris perintah dan mengapa dengan nilai yang dihitung tidak bekerja dalam bash script. Jawaban Anda menyelamatkan skrip saya. Saya akan menambahkan di sini juga beberapa contoh terdokumentasi yang bagus yang saya gunakan untuk lebih memahami bagaimana eval bekerja. linuxhint.com/bash_eval_commandSaya biasanya menempatkan perintah dalam tanda kurung
$(commandStr)
, jika itu tidak membantu saya menemukan mode debug bash hebat, jalankan script sebagaibash -x script
sumber
sumber
jangan menaruh perintah Anda dalam variabel, jalankan saja
sumber
"${arg}"
. contoh: server :: team_l_start = "$ {teamAComm}"./me cast cast rais_dead ()
Saya mencari sesuatu seperti ini, tetapi saya juga perlu menggunakan kembali string yang sama minus dua parameter jadi saya akhirnya menemukan sesuatu seperti:
Ini adalah sesuatu yang saya gunakan untuk memantau pembuatan heat stack openstack. Dalam hal ini saya mengharapkan dua kondisi, tindakan 'BUAT' dan status 'SELESAI' di tumpukan bernama "Somestack"
Untuk mendapatkan variabel-variabel itu saya bisa melakukan sesuatu seperti:
sumber
Inilah skrip gradle build saya yang mengeksekusi string yang disimpan di heredocs :
Satu-satunya ")" agak jelek. Tapi saya tidak tahu bagaimana cara memperbaiki aspek astetik itu.
sumber
Untuk melihat semua perintah yang dijalankan oleh skrip, tambahkan
-x
bendera ke baris shabang Anda, dan jalankan perintah secara normal:Kemudian jika Anda terkadang ingin mengabaikan hasil debug, arahkan ke
stderr
suatu tempat.sumber