我必須通過模擬器運行二進制檔案,但二進制檔案是龐大而復雜的基準測驗套件的一部分。那么在正常系統上會是這樣的:
# First form
./binary -long=list -of=args <input.txt >std.out 2>std.err
需要看起來像這樣:
# second form
simulator -c ./binary -o "-long=list -of=args" -i input.txt --output=std.out --errout=std.err
該基準測驗套裝是繞過命令,即所有的二進制后(引數和重定向)在(bash)的變數如的東西$CMD="./binary -long=list -of=args <input.txt >std.out 2>std.err",我需要找出什么都重定向(即的目標intpu.txt,std.out并std.err在示例),因此我可以將第一種形式的命令轉換為第二種形式的命令)。
那么有沒有辦法,例如,告訴 bash 獲取$CMD包含二進制檔案、引數和重定向的命令,并決議它,然后回傳,比如說,輸入重定向是什么(即input.txt),或其中之一其他重定向(std.out或std.err)?
當然沒有手動進行決議......
像這樣的東西:
$ CMD="./binary -long=list -of=args <input.txt >std.out 2>std.err"
$ bash -secret_option_to_parse_redirect_target=input "$CMD"
intpu.txt
$ bash -secret_option_to_parse_redirect_target=output "$CMD"
std.out
$ bash -secret_option_to_parse_redirect_target=error "$CMD"
std.err
uj5u.com熱心網友回復:
如果您相信您cmd可以決議為單個簡單命令,則可以使用eval在它周圍添加一個包裝器來讀取命令列和活動重定向。請參閱在https://replit.com/@CharlesDuffy2/GrouchyHelplessInformationtechnology#main.sh 上運行的此代碼
請注意,這需要一個/proc/*/fd介面與 Linux 提供的介面兼容的作業系統。
read_fd() {
local fd_num dest_var fd_dest default_val bash_pid=$BASHPID
fd_num=$1; dest_var=$2; default_val=${3:-"/proc/self/fd/$fd_num"}
printf -v "$dest_var" %s "$default_val"
[[ -e /proc/$bash_pid/fd/$fd_nume ]] || return
fd_dest="$(readlink "/proc/$bash_pid/fd/$fd_num")" || return
[[ -e $fd_dest ]] || return
printf -v "$dest_var" %s "$fd_dest"
}
parse_cmd() {
read_fd 0 stdin_src
read_fd 1 stdout_dest
read_fd 2 stderr_dest
argv_dest=( "$@" )
}
...用作:
# all-caps variable names are reserved; do not use them in your own code
cmd="./binary -long=list -of=args <input.txt >std.out 2>std.err"
# inputs need to exist for redirections to work
touch input.txt
eval "parse_cmd $cmd"
echo "stdout destination is $stdout_dest"
echo "stderr destination is $stderr_dest"
echo "stdin source is $stdin_src"
echo "argument list follows, one per line:"
printf ' - %q\n' "${argv_dest[@]}"
echo
echo "to run this, you could use:"
echo "${argv_dest[*]@Q} <$stdin_src >$stdout_dest 2>$stderr_dest"
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324851.html
