簡體   English   中英

如何欺騙shebang以允許多個參數?

[英]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 行而無效,因此唯一可接受的解決方法也是注釋,也以“#”開頭。

有沒有辦法繞過這個問題?

不使用多語言腳本的通用解決方案

啟動器.sh

#!/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM