标签: path

Bash:文件中一行的路径或链接?

/path/to/fname#line1242
Run Code Online (Sandbox Code Playgroud)

有没有办法将文件中的特定行号作为路径名的一部分引用,或者以某种方式将链接打包到看起来/行为像路径名的行号?例如,将上面的字符串提供给同一文件系统的另一个用户,以便他们可以轻松打开我的文件“fname”并立即位于其中的第 1242 行。

我正在考虑类似于 HTML 锚点的行为,它可以包含在页面的 URI 中,然后表现得就像链接一样。也就是说,它们可以提供给同一文件系统的其他用户,并向这些用户指示文件中的给定行,默认情况下打开文件到该行。我意识到在 UNIX 中,唯一真正可以成为路径名一部分的东西可能是目录、文件和伪文件。但是,还有 glob、字符串扩展等,它们严格来说并不是路径名的一部分,但可以“舒适地”插入其中,而文件名可以被传递和引用,而不需要任何额外的命令。是否有一种内联方法可以模拟 UNIX 文件的锚点/链接行为?

我可以在我的“路径名”中包含命令替换和sed "1242p"某种自引用,但随后我不再处理路径名,而只是处理文件上的命令。想一想,那么我就不会链接,只是提取一行。我根本想不出链接到特定行的方法(不忽略文件的其余部分)。

GNU bash,版本 3.2.51

bash path hard-link files

6
推荐指数
1
解决办法
992
查看次数

在 Linux Alpine 3.11 上找不到 $PATH 中的 SH 脚本

我使用 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)

linux path shell-script alpine-linux

6
推荐指数
1
解决办法
4025
查看次数

使用 update-alternatives 设置 JAVA_HOME 和 PATH

编辑

问题更多的是关于 bash 脚本和 java 环境,感谢那些有耐心并抽出时间回复我的人。我非常感激。

至于Java环境我开始使用sdkman。当我开始这个小脚本时,我实际上正在寻找类似的东西,我正在考虑做类似的事情。无论谁正在寻找我的问题的答案,我都建议使用该工具。如果你有自己的剧本并不重要,我强烈建议你尝试一下。

sdkman 将关心语言版本安装、侧面需求(如 maven、gradle 和 kotlin)以及环境变量。

https://sdkman.io/


原始问题

我正在构建一个 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)

bash path java shell-script

6
推荐指数
2
解决办法
9680
查看次数

列出当前用户有权写入的 PATH 目录?

我可以PATH仅从我(当前用户)有权写入的目录中提取内容吗?

我可以想象我需要类似的东西echo $PATH | grep...,但我不知道是什么。

grep path

6
推荐指数
2
解决办法
696
查看次数

如何临时设置 $PATH 和 . (来源)一个文件?

考虑一下这一点。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.(源)文件?

source path shell-script posix

6
推荐指数
2
解决办法
821
查看次数

如何确定将运行我路径上的哪个可执行文件?

我运行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,这就是执行的内容)。无论如何,感谢您的帮助!

path utilities which

5
推荐指数
2
解决办法
2775
查看次数

如何修复 bash 在错误的目录中查找程序的问题(在 Ubuntu 11.10 上设置 NPM 的问题)

这次我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 并再试一次......

shell bash path

5
推荐指数
2
解决办法
8915
查看次数

文件系统路径的非规范化形式是否重要?(例如“foo//bar”、“foo/./bar”和“foo/../bar”)

我有一个用于构建特定风格的 GCC 交叉编译器的脚本。在整个脚本中,有许多不是规范形式的路径,例如重复的路径分隔符 ( /xxx/foo//bar/yyy) 和中间的“this”目录 ( /xxx/foo/./bar/yyy)。

我正准备将所有这些规范化,但我想知道这些形式是否重要,而不仅仅是脚本未被清理的情况。除了刚才提到的形式之外,我还很好奇在路径中包含“up 目录”是否在任何特定情况下也很重要(即“/xxx/foo/../bar/yyy而不是 ” /xxx/bar/yyy)。例如,我遇到了像/xxx/foo/.//bar/yyy.

我能想到的唯一潜在情况是涉及链接时。我可以想象..表单的行为可能会有所不同,但是上面的其他两种表单呢?

也许以这种方式构建路径也有特定于平台的原因..?

filesystems path symlink filenames files

5
推荐指数
1
解决办法
282
查看次数

将路径规范分解为最长公共前缀 + 后缀

给定任意两个绝对 Unix 路径规范1,可以将每个规范分解为最长公共前缀和特定后缀的串联。例如,

/abc/bcd/cdf     -> /abc/bcd + cdf
/abc/bcd/chi/hij -> /abc/bcd + chi/hij
Run Code Online (Sandbox Code Playgroud)

是否有 Unix 实用程序(或多个实用程序)来计算这种分解?(我添加了“或实用程序”,以防有用于计算最长公共前缀和计算相对路径的单独实用程序。)

(我意识到编写此类实用程序并不是非常困难,但我尽量优先使用或多或少标准的工具而不是定制的工具。)

1我写了“路径规范”而不是“路径”来回避给定文件系统、链接等中的(路径的)存在等问题。

path utilities

5
推荐指数
2
解决办法
1387
查看次数

awk + ​​paste 用于清理路径?

我在.cshrc几台机器上的 init 文件中看到过这段代码。我通过一些 awk 教程试图了解它是如何工作的,但我仍然无法解密它。

setenv PATH `echo $PATH | awk 'NF&&\\!x[$0]++' RS='[:|\n]' | paste -sd:`
Run Code Online (Sandbox Code Playgroud)

它有什么作用?

tcsh path awk text-processing

5
推荐指数
1
解决办法
295
查看次数