.bashrc路径问题

.bashrc路径问题

谁能告诉我如何添加一个目录,例如Idl,其中包含许多子目录,IDL_PATH这样.bashrc当我这样做时source .bashrc,我将能够运行所有不同子目录中的所有可执行文件?

这可能吗?我在做

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

Idl文件夹有许多子目录(例如xidlidl_codenet)。但是,我只能运行文件夹中的文件Idl,而不能运行子目录中的文件。

我想要运行的文件是带.pro扩展名的 IDL 过程。如果我将所有.pro文件放入一个目录中,例如/home/cs/Idl,那么我的整个 pro 文件都会运行。

有什么办法吗?

答案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/:$//')

然后: > 源.bashrc

现在我可以运行主 Idl 目录下各个子目录内的所有程序和脚本。

感谢大家的关注。

相关内容