2つのディレクトリの内容を比較し、その結果を標準出力に出力するプログラム(diffのラッパーです)を作成していますが、以下のように出力を比較対照のディレクトリ内のファイルにリダイレクトした場合、このファイルまで比較してしまいます。

$ mydiff . directory > diffresult

これを防ぐため、ファイルを比較する際に、ファイルが他プロセスによってオープンされているかどうか調べ、その旨をstderrに出力するようにしたいのですが、その方法がわからず困っていますのでよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

コマンドにパスが通っていなくても


実行権限がないとは限りません

コマンドをフルパス指定で実行してみてはどうでしょうか
    • good
    • 0

> ですが、このコマンドはrootのみにしか実行権限がない



そうなの?

> 本マシンは複数の開発者で共有しているものなので、あまり気楽にrootになるわけにはいかない

思い付く案を二つほど。

・管理者にお願いして、fuser に実行権限をつけてもらう
・su コマンドを使って、fuser を実行する

結局 su コマンドを使う、ということは root 権限を得ることになるのだから、
「気楽に root になるわけにいかない」ということを解決しているわけには
ならんですが。

ちなみに、こんな感じ。

% su root -c "/usr/sbin/fuser 対象のファイル名"
    • good
    • 0

> ファイルが他プロセスによってオープンされているかどうか調べ、その旨をstderrに出力するようにしたい



使っている OS が分からないのですが、fuser というコマンドがありませんか?
こいつの出力を加工することで、望みの結果を得られるはず。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

使用しているOSはHP-UXで、/usr/sbin/fuserというコマンドはありました。
ですが、このコマンドはrootのみにしか実行権限がないため、管理者ではない私には使用できないものでした。

一応rootのパスワードも知っているため、実験したところ、プロセスIDが得られましたので、これを加工すれば何とかなることが分かりました。
ただし、本マシンは複数の開発者で共有しているものなので、あまり気楽にrootになるわけにはいかないのです。

お礼日時:2001/10/23 17:03

「あるファイルが他プロセスによってオープンされているかどうかを確認する方法」



は知りませんが、

「mydiffの開始よりも後で内容が変更されたかどうかを確認する方法」

で代用できませんか?
mydiffを何で書かれているか分かりませんので、私の標準シェルである
cshで書くと、

# スクリプトの先頭
touch /tmp/mydiff.tmp

....

if( { newer /tmp/mydiff.tmp $f1 } == 0 ) then
echo $f1 is modified after mydiff was invoked.
exit
endif
if( { newer /tmp/mydiff.tmp $f2 } == 0 ) then
echo $f2 is modified after mydiff was invoked.
exit
endif

....

# この辺で$f1と$f2を比較

rm -f /tmp/mydiff.tmp
# スクリプトの末尾

上のスクリプトでは、対応するファイル名が$f1と$f2に
入っていて、diff $f1 $f2とかやって比較している、
と仮定しています。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelVBAでDOSコマンドの標準出力をリアルタイムでフォームへ出力するには

いつもお世話になります。

タイトルにある通りです。
VBAより実行したDOSコマンドの実行結果を、tailコマンドのように、フォーム(テキスト部品など)に出力させたいと考えています。

一度実行結果をファイルへ保存してそれをフォームへ出力させる、というのではなく、あくまでリアルタイムで表示する、ということは可能でしょうか?

よろしくお願いします。

Aベストアンサー

回答番号:No.1の続きになりますが(こんなレスの付け方でいいのか?)

1. 標準入力から読み込んだ文字列を指定WindowへSendMessageで送信するプロセスを作成。
2. VBAのユーザフォームをサブクラス化してハンドラ作成。(受信文字列をテキストボックスへ追加)
3. VBAから実行するコマンド文字列を、送信プロセスにリダイレクトするように作成して実行。

で、できるような気がしますが、どこがわかりませんか?
回答3にもあるように、
>VBAでやる範疇ではないでしょう。
が全てのような。

QUNIXで、ディレクトリを比較して、ファイル・ディレクトリの存在を比較したい

やりたいこと自体は単純なことなのですが・・

UNIXのコマンドで、
2つのディレクトリA、Bを比較して、
Aだけにあるディレクトリ・ファイルのみを取得できるようなものを教えてください。
(ファイルが同一かどうかは問題ではなくて、あくまでも存在不存在の比較です。)

コマンドを組み合わせたり、オプションを使ってもかまいません。

diffコマンドってこういうとき使えないのでしょうか。

Aベストアンサー

( cd (ディレクトリA) ; find . -print |sort ) > A.txt
( cd (ディレクトリB) ; find . -print |sort ) > B.txt
としてディレクトリリストを作っておいて
diff A.txt B.txt | grep '^<' (Aだけにあるファイル)
diff A.txt B.txt | grep '^>' (Bだけにあるファイル)
でどうでしょうか?

Q標準出力とリダイレクトを同時に実行

標準出力の結果をファイルに保存するにはリダイレクトを使うと思いますが、同時に標準出力にも表示したいです。
同時に、リダイレクトの「>>」のように、追記していくようにしたいです。

そのような場合、
http://blog.goo.ne.jp/minimal_room/e/26b4d965cd67ac5abfc4ca024e69501f

によれば、teeコマンドを使うと良いそうなのですが、
./a.out | tee log.txt
のようにすると、標準出力されず、上手くいきませんでした。

どのようなコマンドを打ったら良いか教えて下さい。

Aベストアンサー

/a.out | tee log.txt

それで大丈夫です。a.outの標準出力を、端末とlog.txtに出力します。
log.txtに追記する場合は、 tee -a log.txt です。

>のようにすると、標準出力されず、上手くいきませんでした。

何らかの勘違いですね。a.out が標準出力に出力していないとか。

Q"Xm/XForm.h:そのようなファイル、ディレクトリはありません"って?

X-Windowプログラムで本にあったプログラムをそのまま写して
gcc ファイル名 -lX11 -lXm -lXim -lXt
でコンパイルをしようとしたら
Xm/XForm.h:そのようなファイル、ディレクトリはありません
Xm/XLabel.h:そのようなファイル、ディレクトリはありません
Xm/XPushB.h:そのようなファイル、ディレクトリはありません
Xm/XText.h:そのようなファイル、ディレクトリはありません
Xm/XRowColumun.h:そのようなファイル、ディレクトリはありません
Xm/XCascadeB.h:そのようなファイル、ディレクトリはありません
Xm/XMessageB.h:そのようなファイル、ディレクトリはありません
というメッセージがでてきました。
これをコンパイルさせるにはどうしたらいいのですか?
ちなみに関係があるのかわかりませんがその本はX11R4でプログラムを作成したと書いてありました。
わたしの環境はKondoraで、X11R6というのが入っているようです。
今、プログラムを組むのにコンパイルすら通らないのでまったく進みません。
私はぜんぜん無知の初心者なのでよろしければ詳しく教えてください。
お願いします。

X-Windowプログラムで本にあったプログラムをそのまま写して
gcc ファイル名 -lX11 -lXm -lXim -lXt
でコンパイルをしようとしたら
Xm/XForm.h:そのようなファイル、ディレクトリはありません
Xm/XLabel.h:そのようなファイル、ディレクトリはありません
Xm/XPushB.h:そのようなファイル、ディレクトリはありません
Xm/XText.h:そのようなファイル、ディレクトリはありません
Xm/XRowColumun.h:そのようなファイル、ディレクトリはありません
Xm/XCascadeB.h:そのようなファイル、ディレクトリはあり...続きを読む

Aベストアンサー

Xm は、#1の方のご回答の通り、OSF/Motif という商用のXツールキットです。
が、世の中には LessTif というフリーの OSF/Motif 互換のツールキットがあります。
LessTif については、参考URLをご参照下さい。
私は Linux のことは良く知りませんが、
もしかするとパッケージが用意されているかもしれません。

参考URL:http://www.lesstif.org/

Q外部コマンドを使用しない標準出力の取得方法を教えて下さい

外部コマンドを使用しない標準出力の取得方法を教えて下さい

いつもお世話になっています。
javaのプログラム内で、その直前の標準出力を取得する方法がわかりません。「標準出力 取得」などで検索しても、外部プロセスがらみ(Runtime.getRuntime().exec(xxx)のprocessからストリームを取得など)の事ばかりがヒットしてしまいます。
やりたい事はもっと単純で、標準出力をするメソッドを呼び出した後に、そのメソッドが標準出力した内容を取得したいのです。
以下のコードのコメントの箇所の、具体的な実装方法を知りたいのです。この例では簡単のために、標準出力するメソッドを同一クラス内のメソッドとしていますが、本当は別のクラスのメソッドで、もちろん標準出力の内容は実行時までわかりません。

public class hello {
  public static void main (String[] args) {

    sub();

    // sub()で標準出力した内容をここで取得したい!

  }

  private static void sub(){
    System.out.println("Hello World !!");
  }
}

外部コマンドを使用しない標準出力の取得方法を教えて下さい

いつもお世話になっています。
javaのプログラム内で、その直前の標準出力を取得する方法がわかりません。「標準出力 取得」などで検索しても、外部プロセスがらみ(Runtime.getRuntime().exec(xxx)のprocessからストリームを取得など)の事ばかりがヒットしてしまいます。
やりたい事はもっと単純で、標準出力をするメソッドを呼び出した後に、そのメソッドが標準出力した内容を取得したいのです。
以下のコードのコメントの箇所の、具体的な実装方...続きを読む

Aベストアンサー

単純に考えると
  static String logc = null;//キャッシュ用変数
  private static void sub(){
    logc = "Hello World !!";
    System.out.println(logc);
  }

こうしてあげれば
  public static void main (String[] args) {
    sub();
    // sub()で標準出力した内容をここで取得したい!
    // logcから取得できる
  }
となるのは分かるかしら?

System.out.printlnの記述が一箇所にまとまっていれば
こんなやり方もOKよね。

でもあっちこっちにある場合は
System.out.printlnの内部で
System.out.printlnとキャッシュ処理を用意してあげなくちゃダメね。


たとえばMyPrintStreamというPrintStreamクラスを継承したクラスを作成して
println(引数)メソッド内で
super.println(引数);
logc=引数;
をしてあげる。
あとはMyPrintStreamにget直前ログメソッドを作って
logcをリターンしてあげればいいわ。

単純に考えると
  static String logc = null;//キャッシュ用変数
  private static void sub(){
    logc = "Hello World !!";
    System.out.println(logc);
  }

こうしてあげれば
  public static void main (String[] args) {
    sub();
    // sub()で標準出力した内容をここで取得したい!
    // logcから取得できる
  }
となるのは分かるかしら?

System.out.printlnの記述が一箇所にまとまっていれば
こんなやり方もOKよね。

でもあっちこっちにある場合は
System.ou...続きを読む

Qawkで二つのファイルを比較し出力する方法

UNIXで二つのファイルを使って別ファイルを出力する
処理をしたいのですが、awkで二つのファイルを扱う方法
が分かりませんでした。
やりたい処理は以下のような事です。

ファイルAの1行目"AAA B"と同じ行がファイルBにあったら、ファイルAの"AAA B"の次の行に、
ファイルBの次の行"YYY bbb"を挟み込みます。

もし、ファイルBに同じ行がなかったら、
ファイルAの次の行に"NG"を挟み込みます。

[ファイルA]
AAA B
ZZZ B
AAA C
ZZZ C
AAA D
ZZZ D

[ファイルB]
AAA B
YYY bbb
AAA C
YYY bbb

[出力ファイル]
AAA B
YYY bbb
ZZZ B
AAA C
YYY ccc
ZZZ C
AAA D
NG

どなたか良いスクリプトありましたら
教えていただけないでしょうか。
よろしくお願いします。

Aベストアンサー

perlで書くと、こんな感じでしょうか:

% cat a.pl
open( FA, $ARGV[0] ) or die;
open( FB, $ARGV[1] ) or die;
while ( $a = <FA> ){
print $a;
if ( eof( FB ) ){ undef $b; } else { $b = <FB>; }
print "NG\n" unless $a eq $b;
last unless defined( $b );
$a2 = <FA>;
$b2 = <FB>;
print $b2, $a2 if $a eq $b;
}

質問で出ている例だと、処理できますが、それ以外の場合は動作保証外ですな。

QリアルタイムOS

リアルタイムOSの「リアルタイム」の意味が今ひとつ分かりません。Message CueやTaskによる並列動作はリアルタイムOSの大きな利点ですが、このリアルタイムの意味自身が昔から疑問です。何かの本に「あるタスクを完了する時間が保証されている」とありましたが、タスクの負荷が重い部分や、割り込みが重なったりする最悪の事態などが生じると、このような保証をするのは難しいような気がします。このリアルタイム性について分かりやすい説明をお願いします。

Aベストアンサー

はじめまして。
 非リアルタイム系のOSでは、イベント・キューが発生した場合、他のタスク、たとえばファイル入出力や画面描画処理が走っていると、その処理が終わるまでイベントは待たされることがあります。

 一方リアルタイムOSでは、ある決められた時間以内に(数10μsec~数10msec以内)確実にイベントハンドラが起動されることを保証するの機能があります。(タイマー割り込み処理プログラム)
 また必要な処理時間の予測を行なう機能や、複数の処理要求が同時に発生した場合でも目的の時間内に完了させるための機構を備えています。
 これは許容される時間内に、処理を確実に完了するのを目的にしています。

>タスクの負荷が重い部分や、割り込みが重なったりする最悪の事態などが生じると、このような保証をするのは難しいような気がします。

 一般のOSを使用している場面を想定するとそういう疑問が出て当然です。しかし、リアルタイムOSは、ゲームや計測機器や工作機械の制御装置などの組み込み分野で利用されているものです。
 つまり、ある程度のタスク発生の予想と処理速度がわかっている分野で使用されています。
 逆にいうと、リアルタイムに(非常に高速に)イベントの処理を行なわなければならないような用途に向いているOSだといえます。

はじめまして。
 非リアルタイム系のOSでは、イベント・キューが発生した場合、他のタスク、たとえばファイル入出力や画面描画処理が走っていると、その処理が終わるまでイベントは待たされることがあります。

 一方リアルタイムOSでは、ある決められた時間以内に(数10μsec~数10msec以内)確実にイベントハンドラが起動されることを保証するの機能があります。(タイマー割り込み処理プログラム)
 また必要な処理時間の予測を行なう機能や、複数の処理要求が同時に発生した場合でも目的の時間内に完了...続きを読む

Q2つのconsoleに標準出力ってリダイレクトできますか?(Solaris)

プログラムを実行中の標準出力をリモートから入っている
人に見せたい場合、
#foobar > /dev/pts/1
というようにリダイレクトすれば良いですが、
もしリモートから入っている複数の人(2人以上)
に標準出力を見せる場合はどのようにすればよいのですか?
教えてください。

Aベストアンサー

汚い手ですが…

#foobar | tee /dev/pts/1 | tee /dev/pts/2 | tee /dev/pts/3 > /dev/pts/4
って言うのはダメですか?

Qリアルタイムとは?

よくゲームソフトやハードで、「リアルタイムに処理ができる」又は「リアルタイムムービー」とか言うのをよく聞くのですが、
この「リアルタイム」って何なんでしょうか?ご存じの方がいましたら、よろしくお願いします。

Aベストアンサー

> PS3に関する記事に「ほとんどがリアルタイム演算で動いていた」とあるのですが、これはどうゆうことなんでしょうか?

ムービー再生の手法を使わずに綺麗な3DCGのアニメーションが表示できるほど、グラフィック機能が高性能だって意味です。

同等のムービーを表示するだけなら、そのPS3の再生動画を録画して持ってくれば、PS2でも同じ動画を見ることが出来ますが、
「もうちょっとキャラクタを増やしたい」
「反対側から見た絵にしたい」
という事は元のPS3のリアルタイム処理の方でなければ出来ません。

QDOSからLPT1への出力をファイルに出力できますか

DOS窓において

LPT1ポートにプリント出力しています。

このプリントを用紙に出力せず、ファイルに出力できますか。

Aベストアンサー

> ファイルに保存する方法はないでしょうか?
LPRINTはプリンタに出力するための命令ですので、それを使ってファイルに保存するということはできません。

N88-BASICの場合、それぞれ次のような対応になっています。
画面  :PRINT
ファイル:PRINT #x (x=1,2,…)
プリンタ:LPRINT


人気Q&Aランキング

おすすめ情報