.bashrc パスの問題

.bashrc パスの問題

Idlたとえば、多くのサブディレクトリを含むディレクトリを追加してこれを実行すると、他のすべてのサブディレクトリIDL_PATHにあるすべての実行可能ファイルを実行する方法を教えてください。.bashrcsource .bashrc

可能ですか?私が何をしているのか

IDL_PATH=.:+/idl/idl70/lib:/home/cs/Idl .... 

このIdlフォルダには多くのサブディレクトリ(例:xidlなどidl_code)がありますnet。ただし、サブディレクトリではなくフォルダからのみファイルを実行できますIdl

私が実行したいファイルは.pro拡張子を持つIDLプロシージャです。すべて.proのファイルを1つのディレクトリ(たとえば)に入れると、/home/cs/Idlproファイル全体が実行されます。

解決策は何ですか?

答え1

実行可能ファイルを含む各ディレクトリを個別に追加するか、すべての実行可能ファイルを同じディレクトリにリンクする必要があるようです。

  1. すべてのディレクトリを手動で追加します。

    まず、関連ディレクトリのリストを収集します(Linuxを実行しているか、GNUツールがあるとします)。

    find /home/cs/Id -type f -executable -exec dirname {} + | sort -u
    

    上記のコマンドはすべての実行可能ファイルを検索し、/home/cs/Idそのファイルを含むディレクトリの名前を印刷します。sort -u各ディレクトリを一度だけ印刷してください。私はいくつかのテストディレクトリを作成したので、私のシステムから次のようになります。

    $ find /home/terdon/Idl/ -type f -executable -exec dirname {} + | sort -u
    /home/terdon/Idl/foo/bar/bag/ho
    /home/terdon/Idl/foo/bar/bag/ho/fa/fe/re
    /home/terdon/Idl/foo/bar/baz/foo/bar
    /home/terdon/Idl/foo/bar/baz/foo/bar/baz/foo/bar/baz
    

    それでは、次の形式に追加する正しい形式に変換したいと思います$PATH

    $ find /home/terdon/Idl/ -type f -executable -exec dirname {} + | sort -u | tr '\n' ':'
    /home/terdon/Idl/foo/bar/bag/ho:/home/terdon/Idl/foo/bar/bag/ho/fa/fe/re:/home/terdon/Idl/foo/bar/baz/foo/bar:/home/terdon/Idl/foo/bar/baz/foo/bar/baz/foo/bar/baz:
    

    そのコンテンツ(最後のコンテンツを除く:)をコピーして、次の項目に追加しますPATH

    PATH="$PATH:/home/terdon/Idl/foo/bar/bag/ho:/home/terdon/Idl/foo/bar/bag/ho/fa/fe/re:/home/terdon/Idl/foo/bar/baz/foo/bar:/home/terdon/Idl/foo/bar/baz/foo/bar/baz/foo/bar/baz"
    
  2. すべての実行可能ファイルを見つけ、すでにPATHにあるディレクトリにシンボリックリンクします。

    find /home/terdon/Idl/ -type f -executable -exec ln -s {} ~/bin \;
    

    一部のLinuxシステム(Ubuntuなど)では、この~/binディレクトリが存在する場合はディレクトリに自動的に追加されます。PATHシステムでこれが起こらない場合は、自分で追加してください。

    PATH="$PATH:/home/cs/bin"
    

答え2

私はディレクトリを列挙する必要があると思います。これにより、次の行が自動的に生成されます。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Copyright © 2016 Martin Ueding <[email protected]>
# Licensed under the MIT license

import argparse
import os


def main():
    options = _parse_args()

    additions = []

    for base in options.base:
        for dirpath, dirnames, filenames in os.walk(base):
            additions.append(dirpath)

    line = ':'.join(additions)

    if options.short:
        print(line)
    else:
        print('PATH=$PATH:'+line)


def _parse_args():
    parser = argparse.ArgumentParser(description='')
    parser.add_argument('base', nargs='+', help='Basepath')
    parser.add_argument('--short', action='store_true')
    options = parser.parse_args()

    return options


if __name__ == '__main__':
    main()

そのスニペットを別の名前で保存して/usr/bin/path-recurse適用しますchmod +x /usr/bin/path-recurse。その後、プロンプトでそれを使用して行を作成すると、path-recurse /tmp /foobar …Bashラインが提供されます。

PATH=$PATH:/tmp:/tmp/kde-muIusrrC:/tmp/vs0cOIg:/tmp/.esd-1000:/tmp/ssh-oGWOvuUnyqPF:/tmp/.Test-unix:/tmp/.font-unix:/tmp/.XIM-unix:/tmp/.ICE-unix:/tmp/.X11-unix 

または、次のように使用できます.bashrc

PATH=$PATH:$(path-recurve /tmp /foobar …)

.bashrc次に、ソーシングされるたびにすべてのフォルダを動的に繰り返します。

答え3

私は問題を解決したと思います。私が書いた.bashrcファイルで私がしたことはすべて次のとおりです。

PATH=${PATH}:$(find ~/Idl -type d | tr '\n' ':' | sed 's/:$//')

次に:> source.bashrc

これで、デフォルトのIdlディレクトリの下のさまざまなサブディレクトリからすべてのプログラムとスクリプトを実行できるようになりました。

関心をお寄せいただきありがとうございます。

関連情報