Есть ли способ использовать HEREDOC для Bash и Zsh и иметь возможность использовать аргументы?

Только что попробовал сам:Нужен только пакет lxqt-core! Этот пакет уже предоставляет необходимые зависимости, такие как диспетчер отображения, оконный менеджер, файловый менеджер(pcmanfm-qt)и панель.


Кроме того, рекомендуется также установить lxqt-qtplugin, иначе значки символов не будут работать должным образом...

6
17.12.2020, 06:24
3 ответа

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

#!/bin/sh -

foo() {
    ruby -e '
        3.times do
            puts "Ruby is getting the argument #{ARGV[0]}"
        end
    ' -- "$@"
}

foo test-arg

Аналогично python -c 'command', или awk '', или sh -c 'command'и т. д. Далее следуют аргументы. Внутри кавычек вы можете написать многострочный текст со своим кодом.(--важно для определения конца опций, например. для случая следующий аргумент начинается с -, см. также этот ответ)

На самом деле это оболочка для команды ruby, вы можете использовать оболочка для фильтрации ввода, обработки вывода, вызова дополнительных программ и т. д. Также здесь вы можете увидеть больше о ссылке на аргументы, я заменил на "$@"для ссылки на все аргументы, передаваемые из сценария оболочки для команды ruby ​​вы также можете использовать $1, $2и т. д.

Конечно, следует обратить внимание на одинарные кавычки. Если можете, избегайте их. Вероятно, существует несколько способов их использования, например \047или интерполяция \'между двумя строками в одинарных кавычках. Пример:

$ ruby -e 'puts "Ruby\047s #{ARGV[0]}"' great
Ruby's great
$ ruby -e 'puts "Ruby'\''s #{ARGV[0]}"' great
Ruby's great

Здесь еще немного о цитировании.

8
18.03.2021, 22:42

В системах с /dev/fd/nвсегда можно выполнить:

foo() {
  ruby /dev/fd/3 "$@" 3<< 'EOF'
    3.times do
      puts "Ruby is getting the argument #{ARGV[0]}"
    end
EOF
}

Здесь используется fd выше 2, поэтому ваш rubyскрипт может по-прежнему использовать stdin/stdout/stderr без изменений.

Если ваша система одна из немногих, которые до сих пор не поддерживают /dev/fd/n, вы можете сделать:

foo() {
  ruby - "$@" << 'EOF'
    3.times do
      puts "Ruby is getting the argument #{ARGV[0]}"
    end
EOF
}

(где rubyсам интерпретирует -как значение stdin).

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

Heredoc — это функция, появившаяся в оболочке Bourne в конце 70-х годов. Это оператор перенаправления, он означает перенаправление некоторого файлового дескриптора (0, также известного как стандартный ввод по умолчанию ), на некоторый фиксированный контент. Первоначально это было реализовано через временный файл, хотя некоторые оболочки, включая bash5.1+, вместо этого иногда используют каналы ().

Также обратите внимание, что в ruby -e code -- arbitrary-argument, как и в sed -e codeили perl -e code, но в отличие от sh -c code, python -c code, вам нужно --, чтобы пометить конец опций, как если бы arbitrary-argumentначинается с -, это будет рассматриваться как вариант ruby.

Он нам не нужен ни в ruby /dev/fd/3 arbitrary-argument, ни в ruby - arbitrary-argument, так как параметры не ожидаются после аргумента параметра, отличного от -, то есть -или /dev/fd/3.

11
18.03.2021, 22:42

Параметр " -" указывает на "стандартный ввод".

foo() {
  ruby - "$@" << 'EOF'
    3.times do
      puts "Ruby is getting the argument #{ARGV[0]}"
    end
EOF
}
$ foo bar
Ruby is getting the argument bar
Ruby is getting the argument bar
Ruby is getting the argument bar
$ 
0
18.03.2021, 22:42

Теги

Похожие вопросы