/path/to/fname#line1242
Run Code Online (Sandbox Code Playgroud)
有没有办法将文件中的特定行号作为路径名的一部分引用,或者以某种方式将链接打包到看起来/行为像路径名的行号?例如,将上面的字符串提供给同一文件系统的另一个用户,以便他们可以轻松打开我的文件“fname”并立即位于其中的第 1242 行。
我正在考虑类似于 HTML 锚点的行为,它可以包含在页面的 URI 中,然后表现得就像链接一样。也就是说,它们可以提供给同一文件系统的其他用户,并向这些用户指示文件中的给定行,默认情况下打开文件到该行。我意识到在 UNIX 中,唯一真正可以成为路径名一部分的东西可能是目录、文件和伪文件。但是,还有 glob、字符串扩展等,它们严格来说并不是路径名的一部分,但可以“舒适地”插入其中,而文件名可以被传递和引用,而不需要任何额外的命令。是否有一种内联方法可以模拟 UNIX 文件的锚点/链接行为?
我可以在我的“路径名”中包含命令替换和sed "1242p"某种自引用,但随后我不再处理路径名,而只是处理文件上的命令。想一想,那么我就不会链接,只是提取一行。我根本想不出链接到特定行的方法(不忽略文件的其余部分)。
GNU bash,版本 3.2.51
我使用 Alpine Linux 3.11 作为新的 Docker 容器。
我有默认$PATH变量,内容如下:
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
当我放置一个脚本wait-for(以 开头的shell脚本#!/bin/sh)时,/usr/local/bin它显示正常:
chmod +x wait-for
mv wait-for /usr/local/bin/wait-for
ls -l /usr/local/bin/wait-for
Run Code Online (Sandbox Code Playgroud)
产生:
-rwxr-xr-x 1 root root 1451 May 1 16:09 /usr/local/bin/wait-for
Run Code Online (Sandbox Code Playgroud)
它也在我使用时运行 sh /usr/local/bin/wait-for用来执行它。
但是,当我进入/usr/src/并尝试跑步时,wait-for我得到了sh: wait-for: not found
我的理解是因为/usr/local/bin目录在$PATH位于该目录中,所以应该全局调用任何脚本。
我误解了什么?
/usr/src/如果我使用sh /usr/local/bin/wait-for,我可以运行文件,但如果我使用/usr/local/bin/wait-for(不带sh前缀),则不能运行,它返回sh: /usr/local/bin/wait-for: not found.
的输出/etc/fstab是:
/dev/cdrom /media/cdrom iso9660 noauto,ro …Run Code Online (Sandbox Code Playgroud) 问题更多的是关于 bash 脚本和 java 环境,感谢那些有耐心并抽出时间回复我的人。我非常感激。
至于Java环境我开始使用sdkman。当我开始这个小脚本时,我实际上正在寻找类似的东西,我正在考虑做类似的事情。无论谁正在寻找我的问题的答案,我都建议使用该工具。如果你有自己的剧本并不重要,我强烈建议你尝试一下。
sdkman 将关心语言版本安装、侧面需求(如 maven、gradle 和 kotlin)以及环境变量。
我正在构建一个 bash 脚本来自动考虑活动 java 的版本来设置用户的 JAVA_HOME 和 PATH,但是由于某种原因 PATH 没有正确构建,它添加了空格而不是“:”,任何人都可以告诉我为什么?
下面是脚本。
谢谢!
#!/bin/bash
export JAVA_HOME=$(dirname $(dirname `readlink -f /etc/alternatives/java`))
IFS=':';
for i in $PATH;
do
JAVA1=$i/bin/java
JAVA2=$i/java
if [ -d "$i" ];
then
if [ ! -L "$JAVA1" ] && [ -x "$JAVA1" ] || [ ! -L "$JAVA2" ] && [ -x "$JAVA2" ];
then
echo "dropping path: $i";
else
NEW=$NEW:$i
fi
fi
done
PATH=$NEW:$JAVA_HOME/bin …Run Code Online (Sandbox Code Playgroud) 我可以PATH仅从我(当前用户)有权写入的目录中提取内容吗?
我可以想象我需要类似的东西echo $PATH | grep...,但我不知道是什么。
考虑一下这一点。IFS仅在执行时设置read。
IFS='' read -r REPLY
Run Code Online (Sandbox Code Playgroud)
但是,如果我对.(source)执行类似操作,即使在执行该代码行之后,变量也会被分配和更改。
PATH="/new_path:${PATH}" . script.sh
echo "$PATH" # Value changed
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种情况呢?我认为.和 Bash 一样source,是一个类似于reador 的命令echo。有没有任何文档,例如2.14。特殊的内置实用程序,提到这种行为吗?
如何以符合 POSIX 的方式临时设置$PATH和.(源)文件?
我运行which并得到以下信息,
brendan$ which python
/opt/local/bin/python
brendan$ which -a python
/opt/local/bin/python
/usr/bin/python
brendan$ ls -l /opt/local/bin/python
lrwxr-xr-x 1 root admin 24 22 Jul 00:45 /opt/local/bin/python -> /opt/local/bin/python2.4
brendan$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
...
(this is the python version in /usr/local/bin)
Run Code Online (Sandbox Code Playgroud)
我的观点是,which没有告诉我主要的可执行文件,即优先执行的那个。我怎么知道这个?
我在 Macbook 上运行 OSX 10.6,尽管这个问题对 UNIX 类用户很普遍。
更新:我一直在我的系统上删除许多冗余版本的 Python(我至少有六个)并删除PATH了一堆初始化文件中的各种粗俗声明。在这个过程中,不知何故,一个新的 shell 现在显示了预期的输出(即which显示/opt/local/bin/python,这就是执行的内容)。无论如何,感谢您的帮助!
这次我curl http://npmjs.org/install.sh | sudo sh从 dir运行了“信任”安装脚本/。
$ which npm
/usr/local/bin/npm
$ npm
bash: /home/steven/local/bin/npm: No such file or directory
$ echo $PATH
/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/home/steven/local/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ ls /home/steven/local/bin
node node-waf
$ ls /usr/local/bin
node node-waf npm npm_g npm-g
Run Code Online (Sandbox Code Playgroud)
似乎某个地方的某个脚本正在污染我的$PATH. 我想知道的是,如果bash在它查找的第一个目录中找不到该程序,它不是一直在查看$PATH吗?应该可以在里面找到/usr/local/bin!
npm真的,真的似乎不想只是工作。我想我要去加载一个稍微旧的 Ubuntu 并再试一次......
我有一个用于构建特定风格的 GCC 交叉编译器的脚本。在整个脚本中,有许多不是规范形式的路径,例如重复的路径分隔符 ( /xxx/foo//bar/yyy) 和中间的“this”目录 ( /xxx/foo/./bar/yyy)。
我正准备将所有这些规范化,但我想知道这些形式是否重要,而不仅仅是脚本未被清理的情况。除了刚才提到的形式之外,我还很好奇在路径中包含“up 目录”是否在任何特定情况下也很重要(即“/xxx/foo/../bar/yyy而不是 ” /xxx/bar/yyy)。例如,我遇到了像/xxx/foo/.//bar/yyy.
我能想到的唯一潜在情况是涉及链接时。我可以想象..表单的行为可能会有所不同,但是上面的其他两种表单呢?
也许以这种方式构建路径也有特定于平台的原因..?
给定任意两个绝对 Unix 路径规范1,可以将每个规范分解为最长公共前缀和特定后缀的串联。例如,
/abc/bcd/cdf -> /abc/bcd + cdf
/abc/bcd/chi/hij -> /abc/bcd + chi/hij
Run Code Online (Sandbox Code Playgroud)
是否有 Unix 实用程序(或多个实用程序)来计算这种分解?(我添加了“或实用程序”,以防有用于计算最长公共前缀和计算相对路径的单独实用程序。)
(我意识到编写此类实用程序并不是非常困难,但我尽量优先使用或多或少标准的工具而不是定制的工具。)
1我写了“路径规范”而不是“路径”来回避给定文件系统、链接等中的(路径的)存在等问题。
我在.cshrc几台机器上的 init 文件中看到过这段代码。我通过一些 awk 教程试图了解它是如何工作的,但我仍然无法解密它。
setenv PATH `echo $PATH | awk 'NF&&\\!x[$0]++' RS='[:|\n]' | paste -sd:`
Run Code Online (Sandbox Code Playgroud)
它有什么作用?