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

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

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

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

  • Разрешить владельцу создавать и читать файлы, но не изменять или удалять
  • Невозможно вставить записи в sqlite в среде Linux
  • причина добавления разрешений на выполнение сценария оболочки
  • Может ли сценарий быть исполняемым, но не читаемым?
  • Что является переопределением опции установки разрешений fstab?
  • Как исправить ошибку 403, которую я получаю с XAMPP, пока я использую mod_userdir?
  •  $ chmod 755 helloworld.sh $ ./helloworld.sh Hello, World! 

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

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

  • fstab не поддерживает режим чтения
  • Разрешение отклонено для записи в журнал mysql
  • Внешнее хранилище Automount можно читать и записывать в Debian XFCE?
  • Может ли сценарий быть исполняемым, но не читаемым?
  • член группы не может записать файл с возможностью записи в группу с помощью reiserfs и расширенных списков ACL
  • Как я могу предоставить все разрешения для файла для одного пользователя, а не я?
  • 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? 
    Linux и Unix - лучшая ОС в мире.