Передача файла в виде одного строкового аргумента в функцию bash - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть функция Bash, которая для удобства переносит команду java. Команда принимает аргумент, который на самом деле является JSON и может быть несколько большим, поэтому я предпочитаю хранить его в многострочном файле.

Вот упрощенный пример.

Java-программа Test просто выводит свой последний аргумент командной строки, как есть, с символами новой строки и отступами, как в файле JSON. Это работает:

$ java Test -s test "$(cat test.json)"
{
    "id": 123,
    "name": "Test"
}

Теперь моя функция Bash выглядит следующим образом:

jwt() { java Test $@; }

Когда я теперь вызываю функцию с подкомандой cat, переданный аргумент прерывается:

$ jwt -s test "$(cat test.json)"
{
$ jwt -s test "`cat test.json`"
{

Те же командные строки работают в zsh , но я хотел бы узнать, как это сделать с bash .


Другой пример - вместо java я просто буду использовать echo.

Это работает:

$ echo "$(cat test.json)"
{
    "id": 123,
    "name": "Test"
}

Функция Bash:

e() { echo $@; }

Называя это:

$ e "$(cat test.json)"
{ "id": 123, "name": "Test" }

Удивительно, но белое пространство здесь сжимается в единое пространство. Хотите знать, в чем разница с Java.

1 Ответ

2 голосов
/ 16 апреля 2019

"$@" - это особый случай, который правильно сохраняет аргументы, как и предполагалось.

$ cat Foo.java
public class Foo {
  public static void main(String[] args) {
    for (String arg: args) {
      System.out.println("'"+arg+"'");
    }
  }
}

$ cat foo.sh
#!/bin/sh

foo() {
  java Foo "$@"
}

foo arg1 arg2 "arg 3"

$ sh foo.sh
'arg1'
'arg2'
'arg 3'
...