[英]How to trick shebang to allow multiple parameters?
是否知道大多數shebang
實現將支持單個參數,因此如果您有類似的東西
#!/usr/bin/env some-tool-accepting-yaml param1 param2
... (yaml body)
現在它將按預期工作,因為它將使用“param1 param2”參數調用該工具,而不是將其拆分為兩個參數。
似乎一種解決方法的做法是使用類似的東西:
#!/bin/sh
arbitrary_long_name==0 "exec" "/usr/bin/gawk" "--re-interval" "-f" "$0" "$@"
現在這種方法會使基於 YAML 的腳本由於第 2 行而無效,因此唯一可接受的解決方法也是注釋,也以“#”開頭。
有沒有辦法繞過這個問題?
不使用多語言腳本的通用解決方案
#!/bin/bash
# first argument to be split
if [[ $- != *f* ]]; then reset=1; fi
set -f
arg=( $1 )
shift
if [[ $reset = 1 ]]; then set +f; fi
# other arguments
arg+=("$@")
# launch command
exec "${arg[@]}"
#!/path/to/launcher.sh interpreter opts
這個問題沒有通用的解決方案(除非你在 MacOSX 上,它可以在shebang
行中傳遞多個參數),但對於特定的需求組合,你可以使用 shell 技巧,例如:
#!/bin/sh
exec yamllint -f colored --no-warnings ${1:+-c ${1}} - <<...
---
(YAML document)
...
我們正在使用 shell 的HERE-doc
功能和 YAML 文檔結束標記...
來表示 shell 輸入的結束位置。 請注意,這僅適用於可以接受來自 STDIN 的輸入的命令。
如果some-tool
需要文件名作為輸入參數,您可以(ab)使用bash
就地文件實現功能,其中命令的輸出通過映射的文件描述符傳遞:
#!/bin/bash
exec ansible-playbook --ask-become-pass ${1:+--extra-vars hostname=${1}} <(tail +3 ${0})
---
- hosts: all
gather_facts: false
become: true
vars_prompt:
- name: hostname
prompt: "Hostname"
private: no
tasks:
(YAML document)
我們正在傳遞tail
命令的輸出,通過/dev/fd/xx
文件描述符跳過此文件的前 3 行, ansible-playbook
其視為普通可讀文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.