谁能告诉我如何添加一个目录,例如Idl
,其中包含许多子目录,IDL_PATH
这样.bashrc
当我这样做时source .bashrc
,我将能够运行所有不同子目录中的所有可执行文件?
这可能吗?我在做
IDL_PATH=.:+/idl/idl70/lib:/home/cs/Idl ....
该Idl
文件夹有许多子目录(例如xidl
、idl_code
等net
)。但是,我只能运行文件夹中的文件Idl
,而不能运行子目录中的文件。
我想要运行的文件是带.pro
扩展名的 IDL 过程。如果我将所有.pro
文件放入一个目录中,例如/home/cs/Idl
,那么我的整个 pro 文件都会运行。
有什么办法吗?
答案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"
查找所有可执行文件并将它们符号链接到 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 目录下各个子目录内的所有程序和脚本。
感谢大家的关注。