パイプでリンクされたスクリプトをどのように実行しますか?

パイプでリンクされたスクリプトをどのように実行しますか?

実行コンテキストから始めて質問を理解してください。

Linux用のWindowsサブシステムで作成されたスクリプトを実行しています。この場合、\r\n改行( )のほかにキャリッジリターンを累積するスクリプトが作成されることもあります。

これは予測できないことが多いです。おそらく私のせいかもしれませんが、これらの間違いをしない方法を学ぶことには興味がありません。したがって、キャリッジリターンを使用してスクリプトを実行する強力な方法があることを願っています。

これまで私が考えたのは、セキュリティ層に会うことです。

<(sed 's/\r//g' script.sh)

bash: /dev/fd/63: 権限が拒否されました。

この場合、ファイルソケット(またはその背後にあるすべて)を実行可能にしませんでした。


bash <(sed 's/\r//g' script.sh) # works
bash <(sed 's/\r//g' foo.py) # ignores foo's hash-bang and fails

2番目のオプションは、Pythonファイルの上部にあるハッシュバンが無視されたか、いくつかの呼び出しステップを見逃したために失敗します。


(一時)オプションは次のとおりです。

python3 <(sed 's/\r//g' script.py)

python<version#>ただし、これはPythonバイナリ()のバージョン管理のために問題があり、#! ...スクリプトの内部行で処理するのが最善です。

また、残りのハッシュバンブルエコシステムでは失敗します。どこでも具体的でなければなりませんが、これは小さなスクリプトを複雑にするのに大きな邪魔になります。


これを実行可能にする方法はありますか?いいえハッシュ爆発を無視してください。それとも、全体的な問題を解決する別の方法はありますか?

答え1

実行する前に、破損したファイルを修復してください。

#!/bin/bash
dos2unix script.py
./script.py

対話的に使用するには、ファイルを実行する前にラッパースクリプトを使用してファイルを回復してください。run_broken_file.sh次の内容でファイル名を作成します。

#!/bin/bash
dos2unix "$1"
"$@" 

だからあなたは実行することができます./run_broken_file.sh ./script.py arg1 arg2 arg3

実行例:

$ unix2dos script.py 
unix2dos: converting file script.py to DOS format...

$ ./script.py 
/usr/bin/env: ‘python3\r’: No such file or directory

$ cat -A script.py 
#!/usr/bin/env python3^M$
import sys^M$
print(f"hello {sys.argv}")^M$

$ cat run_broken_file.sh 
#!/bin/bash
dos2unix "$1"
"$@"

$ ./run_broken_file.sh ./script.py arg1 arg2 'arg3 with spaces'
dos2unix: converting file ./script.py to Unix format...
hello ['./script.py', 'arg1', 'arg2', 'arg3 with spaces']

関連情報