Как я могу получить возврат скрипта bash [duplicate]

<html>
    <head>
        <title>HTML Document</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
    </head>

    <body>
        <div id="hover-id">
            Hello World
        </div>

        <script>
            jQuery(document).ready(function($){
                $(document).on('mouseover', '#hover-id', function(){
                    $(this).css('color','yellowgreen');
                });

                $(document).on('mouseout', '#hover-id', function(){
                    $(this).css('color','black');
                });
            });
        </script>
    </body>
</html>
148
задан Charles Duffy 11 April 2017 в 21:10
поделиться

8 ответов

Используйте конструкцию $( ... ):

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
250
ответ дан user 18 August 2018 в 18:56
поделиться
  • 1
    Это фиксирует вывод команды, но не использует перенаправление. Если вам действительно нужно использовать перенаправление из-за более сложной потребности, см. Мой ответ. Google привел вас сюда, верно? Зачем идти в другое место, чтобы найти ответ, который вы искали? – Bruno Bronosky 5 August 2014 в 23:25
  • 2
    на самом деле не ответ на вопрос ОП – Dmitry Zagorulkin 17 October 2014 в 13:24
  • 3
    @BrunoBronosky это то, что сработало для меня: result=$(( $your_command ) 2>&1) – Katie S 16 September 2015 в 23:07
  • 4
    @Kayvar, когда вы используете $( ... ), он использует новую подоболочку, поэтому результат команды может быть не таким, как в первичной оболочке – Andrey Izman 22 April 2017 в 03:10
read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

В этом методе используется « замещение процесса [* g0] Bash]», чтобы не путать с « заменой команды ».

Вот несколько хороших ссылки:

132
ответ дан Bruno Bronosky 18 August 2018 в 18:56
поделиться
  • 1
    Я тоже считаю, что это правильный ответ. Бывают ситуации, когда $ (...) не работает, когда трубы принимаются везде. – Pierre 29 November 2013 в 20:14
  • 2
    @RichardBronosky Спасибо за сообщение этого ответа. Можно ли получить доступ к переменной в родительском процессе (например, дальше в линии трубопровода, например, в секции handle_mystified_file)? Это кажется невозможным, так как read работает в дочернем процессе, который не может влиять на переменные в родительском процессе. Я пытаюсь разделить выход из процесса, используя tee и «повторно подключиться». tee -разделенные процессы позже, читая вывод одного в качестве аргумента в другом. – user001 11 August 2014 в 01:02
  • 3
    Не работает для меня: echo "test" | read ROLE_X; echo $ROLE_X ничего не печатает. – Phương Nguyễn 30 January 2015 в 14:34
  • 4
    Это требует более высокого уровня. Единственное решение, которое сработало для меня в эти дни. – Phương Nguyễn 30 January 2015 в 14:38
  • 5
    @ PhươngNguyễn, Это не работает, потому что трубы создают вилки процесса. Это еще одна причина, по которой мне пришлось добавить скобки. echo "test" | (read ROLE_X; echo $ROLE_X ) Подробнее об этом разветвлении на stackoverflow.com/a/13764018/117471 – Bruno Bronosky 7 April 2015 в 21:10
  • 6
  • 7
    Все еще не работает со скобками. ls | (read $x; echo $x) печатает только первую строку вывода ls. «read» не может читать более одной строки вывода. – Phil Goetz 2 September 2015 в 16:19
  • 8
    Я хочу, чтобы больше людей понимали использование <(…), это чистая удивительность. ОП должен был дать объяснение. В основном, он выполняет подпроцесс, но вместо того, чтобы связывать его, он возвращает дескриптор файла. Это позволяет использовать команды в тех местах, где вам нужны файлы. Например (как root) vimdiff /etc/sysconfig/iptables <(iptables-save), который заканчивает открытие имени файла, аналогичного /proc/23565/fd/63. Да, vim может принимать - в качестве имени файла и читать с stdin, но это всего лишь пример. Майские вещи не используют - или гораздо более разборчивы с командным порядком, разрешенным <(). – Bruno Bronosky 13 June 2017 в 06:05
  • 9
    @ PhươngNguyễn, можете ли вы поделиться своим делом? Это действительно интересно, потому что я не ожидал, что функция <(...) будет поддерживаться, а back-ticks ar нет. <(...) - это хорошо, но большую часть времени я использую его с diff для сравнения вывода. – ony 28 July 2017 в 15:29
  • 10
    @IntrepidDude Я отредактировал ответ, чтобы включить то, что вам (и другим) нужно знать. Спасибо за вопрос. Это принесет пользу всем. – Bruno Bronosky 22 September 2017 в 14:48

Я предполагаю совместимый способ:

hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`

, но я предпочитаю

hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"
12
ответ дан ony 18 August 2018 в 18:56
поделиться
  • 1
    Спасибо, что упомянул о совместимости. Это был метод, который работал над моей средой, когда другие этого не сделали. – jlsecrest 25 May 2013 в 12:39
  • 2
    Нет необходимости в котировках вокруг $(...). – nikolay 7 October 2013 в 07:26
  • 3
    Да, есть необходимость. Например. если на выходе есть *, в зависимости от того, как вы будете обрабатывать его позже, он попытается расширить его как glob. – Koshinae 25 June 2014 в 10:09
  • 4
    @Koshinae, он попытается расшириться для echo $hash. Но он сохранит * как есть, если вы сделаете hash=$(echo '*'0); echo "$hash" – ony 30 June 2014 в 19:51
  • 5
    Если результатом является несколько слов, он создаст массив no? Поэтому, окружая его кавычками, он создает строку вместо массива строк. Не совсем уверен, относительно новый для bash – Mathieu Dumoulin 23 July 2017 в 18:01

Вы можете сделать:

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)

или

hash=`genhash --use-ssl -s $IP -p 443 --url $URL`

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

1
ответ дан codaddict 18 August 2018 в 18:56
поделиться
  • 1
    Мне нравятся люди, которые пишут ответ, не прочитав в настоящее время. -1 для вас: D, потому что я постоянно их читаю. – erm3nda 21 January 2015 в 07:18

Иногда я получал ошибку при использовании конструктора $(`code`).

Наконец, я получил некоторый подход к этому: https://stackoverflow.com/a/7902174/2480481

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

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

Im so neewbie и все еще ищет полный выход & amp; сохранить в 1 команду. Привет.

0
ответ дан Community 18 August 2018 в 18:56
поделиться

Если конвейер слишком сложный для переноса в $(...), подумайте о написании функции. Доступны любые локальные переменные, доступные во время определения.

function getHash {
  genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
}
hash=$(getHash)

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions

4
ответ дан Noldorin 18 August 2018 в 18:56
поделиться

TL; DR

Чтобы сохранить "abc" в $foo:

echo "abc" | read foo

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

Ответ на вопрос заключается в использовании команды read .

Вот как вы это делаете

# I would usually do this on one line, but for readability...
series | of | commands \
| \
(
  read string;
  mystic_command --opt "$string" /path/to/file
) \
| \
handle_mystified_file

Вот что он делает и почему это важно:

  1. Давайте сделаем вид, что series | of | commands очень сложная серия команд с каналами.
  2. mystic_command может принимать содержимое файла как stdin вместо пути к файлу, но не для аргумента --opt, поэтому он должен входить как переменная. Команда выводит измененный контент и обычно перенаправляется в файл или передается по другой команде. (Например, sed, awk, perl и т. Д.)
  3. read принимает stdin и помещает его в переменную $string
  4. Полагая read и mystic_command в «вспомогательную оболочку» с помощью скобок не требуется, но заставляет его течь как непрерывный канал, как если бы две команды находились в отдельном файле сценария.

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

# my example above as a oneliner
series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file

# ugly and unreadable alternative
mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file

Мой путь полностью хронологический и логический. Альтернатива начинается с 4-й команды и выдает команды 1, 2 и 3 в подстановку команд.

132
ответ дан Bruno Bronosky 18 August 2018 в 18:56
поделиться
  • 1
    Я тоже считаю, что это правильный ответ. Бывают ситуации, когда $ (...) не работает, когда трубы принимаются везде. – Pierre 29 November 2013 в 20:14
  • 2
    @RichardBronosky Спасибо за сообщение этого ответа. Можно ли получить доступ к переменной в родительском процессе (например, дальше в линии трубопровода, например, в секции handle_mystified_file)? Это кажется невозможным, так как read работает в дочернем процессе, который не может влиять на переменные в родительском процессе. Я пытаюсь разделить выход из процесса, используя tee и «повторно подключиться». tee -разделенные процессы позже, читая вывод одного в качестве аргумента в другом. – user001 11 August 2014 в 01:02
  • 3
    Не работает для меня: echo "test" | read ROLE_X; echo $ROLE_X ничего не печатает. – Phương Nguyễn 30 January 2015 в 14:34
  • 4
    @ PhươngNguyễn, Это не работает, потому что трубы создают вилки процесса. Это еще одна причина, по которой мне пришлось добавить скобки. echo "test" | (read ROLE_X; echo $ROLE_X ) Подробнее об этом разветвлении на stackoverflow.com/a/13764018/117471 – Bruno Bronosky 7 April 2015 в 21:10
  • 5
    Все еще не работает со скобками. ls | (read $x; echo $x) печатает только первую строку вывода ls. «read» не может читать более одной строки вывода. – Phil Goetz 2 September 2015 в 16:19
  • 6
    – Bruno Bronosky 9 March 2017 в 23:56
1
ответ дан Arena Hernandez 30 October 2018 в 07:21
поделиться
Другие вопросы по тегам:

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