パイプを使用すると、単純なシェル組み込みコマンドを使用してファイルを生成できます。
{ 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
パラメータはmode
0666に設定されており、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" ; }
pipe2script
2行のテキストを次にパイプするために使用されます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
: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?