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

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

{ echo "#!/bin/bash" \ echo "echo Hello, World!" \ } > helloworld.sh 

С помощью chmod они могут быть выполнены исполняемыми.

 $ chmod 755 helloworld.sh $ ./helloworld.sh Hello, World! 

Интересно, можно ли сохранить шаг chmod . Уже, я обнаружил, что umask не может выполнить эту работу . Но, возможно, кто-то знает переменную окружения, трюк bash, программу для прохода через или другой аккуратный способ сделать это.

Возможно ли, чтобы файл был создан с уже установленным битом исполняемого файла?

  • Может ли сценарий быть исполняемым, но не читаемым?
  • причина добавления разрешений на выполнение сценария оболочки
  • 2 Solutions collect form web for “создавать исполняемые файлы по трубопроводам”

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

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

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

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

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

     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 , но может принимать второй аргумент любого другого имени оболочки, то есть dash , zsh , ksh93 , python и т. Д. Пример использования math команды оболочки fish :

     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? 
    Interesting Posts

    Настройка трех мониторов в debian

    Неожиданно нельзя открыть какой-либо терминал на Linux Mint

    Vim: В чем разница между дробовыми метками движения. и "?"?

    Как синхронизировать все настройки Gnome / Unity на нескольких компьютерах?

    Помните «локальную» историю bash в папке?

    Почему 2 периферийных устройства bluetooth не мешают? (мышь и клавиатура)

    Найти совпадения для 5-го столбца в файлах с разделителями каналов

    Правило Polkit для файлов блока шаблонов systemd

    Ubuntu не загружается нормально после ручной установки X.org

    Преобразование данных столбцов в матрицу

    Контейнер Linux Mint 17.2 занимает слишком много времени для загрузки и может использоваться после входа в систему. Что делать?

    Используйте #! / Bin / sh или #! / Bin / bash для совместимости с Ubuntu-OSX и простоты использования и POSIX

    USB-мышь и клавиатура не работают в Linux 4 Tegra

    найти совпадающие файлы в одном каталоге и подкаталогах

    Почему telnet localhost 25 работает, а telnet mailvm2 25 получает отказ Connection?

    Linux и Unix - лучшая ОС в мире.