Как правильно передать вывод git ls-файлов в Java, если есть имя файла с пробелами? - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь обработать вывод git ls-files в программе Java. Использование просто:

java Test $(git ls-files)

Test.java:

public class Test {
  public static void main(String[] args) {
    for (String s : args) {
      System.out.println(s);
    }
  }
}

, который просто выводит все аргументы на данный момент.

Вывод git ls-files:

input $.csv
input_1.csv
input_2.csv
input_3.csv

Обратите внимание, что первый, input $.csv, имеет пробел в середине.

Мой желаемый результат, конечно:

input $.csv
input_1.csv
input_2.csv
input_3.csv

Однако, что печатает Testout is:

input
$.csv
input_1.csv
input_2.csv
input_3.csv

Пробел фактически нарушает мои ожидания.

Поэтому я попытался sed обернуть все имена файлов в кавычки:

java Test $(git ls-files | sed "s/\(.*\)/'\1'/g")

вывод $(git ls-files | sed "s/\(.*\)/'\1'/g") соответствует ожидаемому:

'input $.csv'
'input_1.csv'
'input_2.csv'
'input_3.csv'

Однако Test все равно печатает один и тот же вывод с sed и без него. Что может быть не так с моими сценариями?

1 Ответ

0 голосов
/ 19 октября 2019

Чтобы сохранить специальные символы в выходных данных git ls-files, используйте флаг -z.

Чтобы передать нулевой разделительный вывод git ls-files -z в качестве списка аргументов командной строки, сохраните выходные данныесначала во временном массиве Bash с использованием встроенного mapfile (требуется как минимум Bash 4). Затем вы можете передать массив в командной строке, правильно сохранив специальные символы.

mapfile -d '' files < <(git ls-files -z)
java Test "${files[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...