パイプによる実行ファイルの生成

パイプによる実行ファイルの生成

パイプを使用すると、単純なシェル組み込みコマンドを使用してファイルを生成できます。

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

これがあればchmod実行可能です。

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

この手順を保存できるかどうかを知りたいですchmod。私は見つけたumask操作を完了できません。。しかし、誰かが環境変数、bashトリック、パイプ、またはこれを行う他の賢い方法を知っているかもしれません。

実行可能ビットが設定されたファイルを生成できますか?

答え1

シェルリダイレクト演算子だけでは実行可能ファイルを生成できません。移植可能な方法はなく、bashには方法がありません(ソースコードでリダイレクト呼び出しを見ることができます)。do_redirection_internalどの着信電話 redir_openパラメータはmode0666に設定されており、openモードは順次呼び出されます。)

とにかくシェルコマンドを呼び出すので、; chmod +x …どこかに追加してください。まったく問題ありません。コードを1行だけ追加しても問題にはなりません。 3つのタスク(与えられた内容でファイルを作成し、ファイルを実行可能にして実行)を実行する必要があるため、3行を作成します。

指定された特定の内容を含む実行可能ファイルを生成する比較的あいまいなシェルコマンドがあります。uudecode。しかし、使用をお勧めしません。読み取れない形式で入力を渡す必要があり、ユーザーのumaskをバイパスしてあいまいです。

ファイルの実行に使用するインタプリタを知っている場合は、bash /the/script代わりに呼び出すのが賢明な選択です。chmod +x /the/script && chmod +x

答え2

パイプ入力で実行可能なシェルスクリプトを生成する関数:

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

pipe2script2行のテキストを次にパイプするために使用されます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関数はデフォルトでusingを使用しますbashが、別のシェル名(たとえば、、など)で2番目の引数を使用dashできzshますksh93。シェルコマンドを使用した例python:fishmath

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?

関連情報