создание исполняемых файлов с помощью труб

Это может быть неприятный вариант, но вы можете использовать w3m в качестве браузера для вывода HTML man :

BROWSER=w3m man -H bash

enter image description here

Он отображает «…» ' с использованием кавычек Unicode (как и Google Chrome, но по какой-то причине lynx этого не делает).

В репозитории man-страниц FreeBSD говорится, что man CentOS 7 поддерживает -H .

2
13.04.2017, 15:36
2 ответа

Невозможно создать исполняемый файл только с помощью оператора перенаправления оболочки. Нет переносимого способа, как и в bash (в исходном коде вы можете видеть, что перенаправление вызывает do_redirection_internal , который вызывает redir_open с параметром ] режим установлен на 0666, и это, в свою очередь, вызывает open с этим режимом).

Вы все равно вызываете команду оболочки, поэтому добавьте ; chmod + x… где-то там. В этом нет абсолютно ничего плохого. Еще одна строчка кода - не проблема. Вам нужно сделать три вещи (создать файл с заданным содержимым, сделать файл исполняемым, выполнить его), поэтому напишите три строки.

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

Разумная альтернатива - вызвать bash / the / script вместо chmod + x / the / script && chmod + x , если вы знаете, с каким интерпретатором запускать файл с .

3
27.01.2020, 21:56

Функция для создания исполняемого сценария оболочки из переданного по трубопроводу ввода:

pipe2script() { touch "$1" ; chmod +x "$1" ; \
                echo '#!'"$(which ${2:-bash})"  > "$1" ; cat >> "$1" ; }

Используйте pipe2script для передачи двух строк текста в foo.sh:

printf 'echo hello world\necho bye\n' | pipe2script foo.sh

Это выводит новый исполняемый файл, foo.sh:

$ ls -log foo.sh 
-rwxrwxr-x 1 38 Mar 18 09:05 foo.sh

Выполнение cat foo. sh показывает:

#!/bin/bash
echo hello world
echo bye

Запуск:

./foo.sh

Выход:

hello world
bye

Функция pipe2script по умолчанию использует bash, но она может принимать в качестве второго аргумента любое другое имя оболочки, т.е. bash. например, dash, zsh, ksh93, python и т. д. Пример использования команды fish оболочки math:

printf 'math "99^33"\n' | pipe2script foo.fish fish

Выполнение cat foo.fish показывает:

#!/usr/bin/fish
math "99^33"

Вывод ./foo.fish:

717730532598275105894510914059816191752829524684539601273450723299

Редактирование копии скрипта:

sed '2,${s/.*/echo & | jethro/e;s/ / "/;s/$/"/}' foo.sh | pipe2script foojc.sh

Вывод при выполнении:

$ ./foojc.sh 
howdy world
y'all come back now, heah?
2
27.01.2020, 21:56

Теги

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