
私のユースケースは次のとおりです。コマンドラインユーティリティは、melt
コマンドライン拡張子を含むファイル名を受け取って開くことができます。.melt
たとえば、次は正しいtest_p.melt
ファイルです。
colour:blue
out=24
colour:red
out=48
...開いてプレイしてくださいmelt test_p.melt
。
今問題は、.melt
ファイルがコメントをサポートしていないことです。コメントをサポートしたいと思います(aを含む行を含む未確認の引数を含むすべての行に対してエラーが発生します#
)。以下はコメント付きtest_c.melt
ファイルです。
# master comment here
colour:blue # this is blue!
out=24
colour:red
out=48
直接開くと、次のようにmelt
なります。
$ melt test_c.melt
Failed to load "# master comment here"
...
...そしてブルースクリーンは表示されません。
だから私は思った。いいね、コメントできます。それでも、Bashプロセス置換を使用してファイルをフィルタリングしてアプリケーションsed
に提供します。melt
まず、以下を使ってテストしてみてくださいcat
。
$ cat <(sed 's/#.*$//' test_c.melt)
colour:blue
out=24
colour:red
out=48
…よさそうですね。しかし、、以下を使用しようとすると、melt
私の戦略が取れます。
$ melt <(sed 's/#.*$//' test_c.melt)
Failed to load "/dev/fd/62"
Failed to load "/dev/fd/62"
デフォルトでは、Melt はプロセス交換用に提供された Bash パイプのファイル名を取得します。しかし、残念ながらそれがmelt
ファイルargv[i]
の場合は、.melt
ファイル名の拡張子を確認する必要があります。プロセスが失敗します。
だから私の質問は:この場合、プロセス置換をどのように使用できますか?それでは、パイプのファイル名に特定の拡張子がありますか.melt
?デフォルトでは、代替結果として/dev/fd/62.melt
渡されると思われるパイプファイル名が必要です。
注:もちろん、いつでもこれを行うことができます。
sed 's/#.*$//' test_c.melt > test_c_temp.melt
melt test_c_temp.melt
...しかし、まずここに2つのコマンドがあります。一方、1行のパイプが必要な場合は、後で一時ファイルを削除するのが気に入らない別の問題が発生します。
Bashプロセスの交換または標準のLinuxツールを介してこれを達成できますか?
答え1
melt
1つの可能性は、ファイルの変更されたコピーを表示するファイルシステムを指すことです。ヒューズこれはファイルシステムドライバを構築する一般的な方法であり、一般的なプログラムとして実装されており、権限は必要ありません。持つ多くのFUSEファイルシステムそして、そのうちの1つがあなたを助ける良い機会があります。アイデアは、.melt
ファイルを読み取るときに「実際の」ファイルを読み取るが、コメントはフィルタリングされるマウントポイントを提供することです。
スクリプトファイルシステム有望に見えます(しかし一度も使ったことがありません)。次のように動作する必要があります。
mkdir ~/uncommented-melt
scriptfs -p "$HOME/bin/uncomment-melt;&*.melt" ~/work ~/uncommented-melt
ファイルを含む~/work
ツリーのルートはどこにありますか?.melt
~/bin/uncomment-melt
#!/bin/sh
sed 's/#.*$//' "$1"
その後、コメントを含むファイルがある場合は~/work/test_c.melt
実行できますmelt ~/uncommented-melt/test_c.melt
。
便利なその他のFUSEファイルシステム:
答え2
zsh
シェルを使用すると、サフィックスを指定できる=(...)
プロセス代替形式(ファイルとパイプの代わりに一時ファイルを使用)を使用できます。/dev/fd/x
(TMPSUFFIX=.melt; melt =(sed 's/#.*$//' test_c.melt))
詳細についてはを参照してくださいinfo zsh TMPSUFFIX
(info
ページがインストールされていると仮定すると、パッケージをインストールする必要があるかもしれませんzsh-doc
)。
答え3
さて、私の特別なケースでは、これらのMeltスクリプトはコマンドライン引数として厳密に解釈されるため、sed
OP内のスクリプトだけでは問題は解決されません。設定ファイルを設定できます。)だから私がやったことは次のとおりです。これは、OPタイトルで扱う他の状況に触発される可能性があります。
私はついにこれを使うことにしました。実際に注釈付きのスクリプトコードを含むスクリプトであるtest.shmelt
ファイルを生成し、スクリプトを編集した後。bash
melt
chmod +x test.shmelt
./test.shmelt
実行すると、test.melt
「クリーンアップ」ファイルが作成され、そのファイルが/tmp
呼び出されます。通常melt
、プログラムはmelt
終了後も端末で実行され続けるため、SIGINTのトラップを介してCtrl-Cを押すとこの一時ファイルを消去できます(必須ではありません)。
それがすべてです。それでもコメントがあります。ソースファイルでMeltをすばやく編集して実行でき、後で使用できるようにコメントが整理されたファイルもあります。
コードは次のとおりですtest.shmelt
。
#!/bin/bash
# call with: ./test.shmelt
#TMLTFILE="test.melt" # for final export
TMLTFILE="${0%%.shmelt}.melt" # for final export
function finished() { echo ; } ; # use this when testing or montaging to keep exported (tmp) .melt file; uncomment the below to remove the tmp file
#~ function finished() { rm /tmp/"$TMLTFILE"; echo "fin1 $0" ; } ; trap finished SIGINT ;
echo 'Remember `pulseaudio --start` to hear audio with `melt`!'
pulseaudio --check
if [ $? -ne 0 ]; then
pulseaudio --start
fi
DIRNAME=$(readlink -f $(dirname $0))
PROFILE="square_ntsc"
echo "
# the profile doesn't work from here;
# still has to be specified on command line
# but including it here so the path is saved for testing
#~ -profile
#~ ${PROFILE}
-video-track
# can avoid pixmap: here, but that s the producer;
# qimage: also works
# NB it is NOT '-out 1645'; but 'out=1645'!!
/media/myimg/%05d.bmp
in=0
out=1645
#~ length=1645
#~ loop=0
#~ eof=stop
-audio-track
/media/mysnd/snd.wav
in=0
out=1645
#~ loop=0
#~ eof=stop
#-consumer xml # doesn't work here
" | sed -e 's/#.*$//' -e 's/^[[:space:]]*//' -e '/^[[:space:]]*$/d' -e 's/[[:blank:]]*$//' > ${TMLTFILE}
# the sed: remove comments; remove indents; remove empty lines; remove spaces at end of line
# eof: one of: stop, loop, continue or pause (eof=stop)
# to loop, use `melt eof=loop ...` (but make sure first,
# that the edit as a whole stops - use xml to check!)
# due to caching issues, preview pieces (up to ~300 frames) like this:
melt eof=loop -profile ${PROFILE} ${TMLTFILE} in=200 out=400
# must have profile here, for checking w/ -consumer xml (else segfault)
# this command may add additional producers to the xml!:
## melt -profile ${PROFILE} ${TMLTFILE} -consumer xml
# use this to generate xml if needed:
#melt -profile ${PROFILE} $(cat ${TMLTFILE} | tr '\n' ' ') -consumer xml
# if exited normally, cleanup:
finished
答え4
少し時間が過ぎましたが、タイトルの質問については私に合った方法で答えてみましょう。
これは関連しています:BASHプロセスの交換が一部のコマンドで機能しないのはなぜですか?
だから私が解決しようとしている具体的な問題は次のとおりです。
- 画像コンバータがあります。
- [任意の形式を挿入]からBMP/PNM/TGAなどの単純な形式に変換します。
- JPEGに変換したいので、ImageMagickに接続する必要があります
convert
。 - 一時ファイルを使用したくありません。
したがって、残念ながら、このツールは出力ファイル名の拡張子から出力形式を派生させるため、stdout / fds / pipesとして出力することは好きではありません。ではどうやってだますか?
適切な拡張子を持つシンボリックリンクを作成し、/dev/fd/N
「一時ファイル」として使用します。
例:
ln -s /dev/fd/4 temp.pnm
[TOOL] -i [INPUTFILE] -o temp.pnm 4>&1 | convert - [OUTPUT.JPG]