2011-08-13 12 views
2
$ date > '< abcd' 
$ cat '< abcd' 
<something> 
$ tclsh8.5 
% exec cat {< abcd} 
couldn't read file " abcd": no such file or directory 

whoops。これは 'exec'の仕様によるものです。'<'を含むコマンドラインパラメータを 'exec'に渡す方法

arg(またはargsのペア)が以下に説明する形式のいずれかを持つ場合、execによって、サブプロセス間の入出力の流れを制御するためにexecによって使用されます。そのような引数はサブプロセスに渡されません。こうした「< FILENAME」などの形態では、fileNameがないか介在空間」と「<」から、または同じ引数で別の引数であってもよい。

この問題を回避する方法はありますか?

+0

このループを閉じるには、 '<'で始まる引数を下流プログラムに渡すことができないという 'exec'の制限があるようです。リダイレクション演算子を別の単語にすることを要求するために、私は「exec」のコピーにパッチを当てました。したがってcat user188012

答えて

4

値を引数として渡す必要がありますか?そうでない場合は、次のようなものを使用できます。

set strToPass "< foo" 
exec someProgram << $strToPass 

ファイル名には、ほとんどの場合、完全修飾名を渡すことができます。完全修飾名はfile normalizeで得ることができます。

exec someProgram [file normalize "< foo"]  ;# Odd filename! 

しかし、あなたは必要<(または>)は、最初の文字を引数に渡す場合は、あなたが立ち往生しています。 execコマンドは、常にリダイレクトなどの引数を消費します。 Unixシェルとは異なり、引用符を使って回避することはできません。

ただし、ヘルパープログラムを使用できます。このように、Unix上でこれを行うことができます。

exec /bin/sh -c "exec someProgram \"$strToPass\"" 

(サブプログラムは、ちょうどあなたがあなたが本当に望んでいたの引数に渡す実行したいものと自分自身を置き換えあなたは前にバックスラッシュを置くことstring mapまたはregsubを使用する必要があります。 )

Windowsでは、バッチファイルを作成して実行する必要があります。これには、特にGUIアプリケーションの場合には注意点と厄介な問題があります。

+0

'<'で始まる引数を渡したい場合、私が立ち往生していることを確認してくれてありがとう。そうですね、上記の方法を組み合わせたり、私のTclのコピーにパッチを当てるつもりでした(私は自分のプログラムで通訳をパッケージ化する能力を持っています)。 – user188012

0

あなたはこのを試してみました

% exec {cat < abcd} 
+0

申し訳ありませんが(期待どおり)動作しません。それは 'cat user188012

0

試してみてください。

セットmyfileの "< ABCD"

幹部猫$ myfileという

+0

(私は実際これを試しましたが、プロンプトにコマンドを貼り付けました)。 – user188012

+0

私は自分のパソコンではないので、試してみることはできません。 <をバックスラッシュでエスケープしてみてください。 – TrojanName

+1

これは間違いなく動作しません。 'exec'が単語の先頭にある' <'を見ているのであれば、それはリダイレクションです。開始位置になければ、引数の先頭にはありません。これはTclの誤った特徴です。 –

2

一つの簡単な解決策:

exec cat "./< abcd" 

一つもう少し複雑:

exec sh -c {cat '< abcd'} 

# also 
set f {< abcd} 
exec sh -c "cat '$f'" 

このpage on the Tcl Wiki会談言葉ははリダイレクト文字でを開始していないことを確認問題について少し。

+0

私はあなたにこの問題とwikiリンクに対する適切な解決策を与えたが、私のケースでは 'cat'コマンドは説明のためだけであった。 「エコー」は、私が実際にやっていることと、よりよく似ています。ストリングをそのまま下流のプログラムに渡したいと思います。 – user188012

+0

「sh -c」にcmdをラップできませんか?これは '<'シンボルをexecの手の届かないところに置きます。 –

+0

はい、できます。しかし、私は地獄を引用して下降しなければならないかもしれません。私はそれを避けるために懸命に努力しています。 :) Tclのexecは、 '<'で始まる引数を下流のプログラムに渡すことはできません。 – user188012

関連する問題