ターミナルウィンドウでemacsを使って手動で編集するファイルがあります。次に、ファイルを読み込み、ファイルにエラーがあるかどうかを確認し、リストをアルファベット順にソートしてファイルを修正するスクリプトがあります。スクリプトを実行する前に、常にファイルを保存してエディタを終了したいと思います。そうしないと、エディタの未保存の変更とスクリプトによる変更の間に競合が発生する可能性があります。
Linuxでは、プログラムは他のプログラムが読み取り/書き込みモードでファイルを開いたかどうかを知ることができますか?この場合、スクリプトにエラーが発生して終了するようにしたいと思います。
そうでない場合は、emacsのラッパーとして機能するスクリプトを作成し、emacsがこの特定のファイルを編集していることを確認すると、セマフォファイルを生成するなど、より複雑なソリューションを検討できます。 (私は通常エイリアスを介してemacsを呼び出します。)
[編集] 私はemacsが目に見えないセマフォファイルを自動的に生成するという事実を利用して私に合った解決策を見つけました。この質問を削除したかったのですが、SEインターフェースではそうすることはできないようです。コマンドラインでFlock(たとえば)を使用して、明示的にflock a.a /bin/emacs -nw a.a
アドバイザリロックを取得することもできます。
答え1
Linuxでは、プログラムは他のプログラムが読み取り/書き込みモードでファイルを開いたかどうかを知ることができますか?この場合、スクリプトにエラーが発生して終了するようにしたいと思います。
プロセスが所有するファイルハンドルを確認できます。しかし、「開く」はやや曖昧な用語です。ファイルを表示して編集するには、ファイルを開き、内容を読み、ファイルハンドルをもう一度閉じます。したがって、他のプログラムは、他のユーザーターゲットプログラムが何を開いたかを合理的に想定することはできません。これは固定概念ではないからです。
あなたのユースケースはあなたに似ています
- 編集者がファイルを保存した後に外部プログラムを自動的に実行して再読み込みするようにしたい場合
- 編集者がファイルの変更を自動的に認識することを確認してください(ほとんどの場合、emacsはこれを行います)。
- または、逆に外部プログラムを有効にして、変更されるファイルを監視します。
最後の方法が可能です。fanotify
最新のLinuxとinotify
すべてのLinux(デフォルトでは常にLinux 2.6.13)で利用可能です。ただし、シェルスクリプトだけではこれを行うことはできません。カーネルからこれらの通知を受け取る言語を使用する必要があります。たとえば、このpyinotify
プログラムを使用したり(私の好きではないが、名前にスペースが含まれているファイルをうまく処理できません)、pyinotify
Pythonプログラムのライブラリとして使用できます。 C ++、C、およびすべてのシステム言語では、直接呼び出しとfanotify
C inotify
APIを介した呼び出しがあります。