1

Я пытаюсь написать функцию, которая возвращает строку, которая состоит из двух частей:

  1. переключатель
  2. имя файла с пробелами.

Моя проблема: Как указать, чтобы передать результат в другую программу?

#!/bin/bash
getOption() {
  echo "-C $1"
}
# prints first lines of man page of cp (copy) 
man $(getOption "$1") cp | head -10

В этом примере я пытаюсь передать настроенный файл конфигурации man . Предполагая, что приведенный выше фрагмент называется run.sh , настроенная конфигурация называется my man.conf и оба находятся в одном каталоге, и я получаю эту ошибку:

$ ./run.sh "my man.conf"
my: No such file or directory
Warning: cannot open configuration file my
# output from man for man…

Как указал Гленн Джекман : я упустил пункт из документов Баша

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

Таким образом, пробелы сохраняются при обновлении до

#!/bin/bash

args=("")
addOption() {
  args+=(-C "$1")
  return 0
}

$(addOption "$1")
man "${args[@]}" cp | head -10

2 ответа2

1

Вы не заключаете в кавычки, вам нужно экранировать пробелы в командной строке, например:

./run.sh my\ man.conf

В большинстве оболочек завершение табуляции поможет сделать это для вас.

Конечно, пробелы в именах файлов и каталогов являются полусредними, и реальное исправление состоит в том, чтобы попытаться избежать их.

п.с. Я думаю, что у вашего сценария есть и другие проблемы, помимо получения правильных аргументов. , ,

1

см BashFAQ/050

По сути, вам нужно реструктурировать. Даже передача кавычек назад из функции не будет работать. это

getOption() {
  echo "-C '$1'"
}

просто приведет к сообщению об ошибке cannot open configuration file 'my

После того, как вы объедините строку, содержащую пробел, в другую строку, вы не сможете извлечь добавленную строку как один объект.

Учитывая ваш вопрос, вы должны просто сделать

man -C "$1" ...

Но я подозреваю, что вы хотите, чтобы файл run.sh был более сложным, чем вы показали. Пожалуйста, предоставьте больше деталей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .