编辑:

编辑:

我想将一个别名文件添加到我的项目文件夹中,以便使用简单的 shell 命令快速打开和编辑其中的文件。
为了使其更具可移植性,我只想使用相对路径。
我想要这样的东西:

### .profile

source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit [/my/project/folder/]afile.txt"

我现在的问题是如何[/my/project/folder/]自动检索。我尝试使用$PWD变量,但结果是别名指向.profile文件的文件夹而不是aliases.bash文件夹。有办法吗?

更新

一些用户向我指出了$PWD解决方案。
这不起作用,因为$PWD变量是相对于命令的路径source,而不是相对于项目路径。
所以我这样做

### .profile

$~/>source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit $PWD/afile.txt"

将创建一个这样的别名

editprojectfiles="edit /my/user/home/folder/afile.txt"

并且这样做

### Call source from folder /foo/bar

$/foo/bar>source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit $PWD/afile.txt"

将创建一个这样的别名

editprojectfiles="edit /foo/bar/afile.txt"

答案1

使用单引号:

alias editprojectfiles='edit $PWD/afile.txt'

更好的是,如果目录名中有空格,请使用这个:

alias editprojectfiles='edit "$PWD"/afile.txt'

编辑:

在阅读了您对 savanto 的回复的评论后,我认为您想要的是以下内容:

  • 您的当前项目文件夹中有一个 file.txt
  • 你编辑这个文件
  • 你转到另一个项目并将 afile.txt 移到新的项目文件夹
  • 你仍想在新的项目文件夹中编辑 afile.txt

基本上,你想编辑同一个 afile.txt,而不管它的位置如何。文件系统上的每个文件都由 inode 号模糊地标识。你可以在 ls 命令中使用 -i 开关查看文件名旁边的 inode 号:

$ ls -Alhi
total 4.0K
8013300 -rw-r--r-- 2 ja ja 10 Jun  3 11:38 afile.txt

这里的 8013300 是 inode 编号。将文件移动到同一文件系统内的其他位置后,其 inode 编号不会改变。现在您需要创建指向 afile.txt 的硬链接。硬链接不同于符号链接。硬链接具有与目标文件相同的 inode 编号。正如我所说,即使文件被移动,文件的 inode 也保持不变,因此即使您将原始 afile.txt 移动到新目录,硬链接仍将指向新目录中的文件。

使用 ln 命令创建硬链接:

$ ln path/to/afile afile

如果您在主目录中执行此操作,则会创建一个文件,并且该文件将具有与 path/to/afile 相同的 inode。尝试编辑 ~/afile 并检查 path/to/afile 是否也发生了变化。尝试将 path/to/afile 移动到其他目录,编辑 ~/afile 并再次检查新位置中的文件是否看起来相同 - 应该相同。

如果它对你有用,那么你的别名看起来如下:

alias editprojectfiles="edit ~/afile.txt"

编辑:

我认为没有办法仅使用 ~/project/aliases.bash 中的 alias 命令来实现这一点。您需要将一个在 alias 命令之前设置的变量传递给 alias 命令。在您的例子中,此变量是 alias.bash 所在的路径。您的 aliases.bash 应如下所示:

DIR="$(dirname ${BASH_SOURCE[0]})";
alias editprojectfiles="edit $DIR/afile.txt"

$DIR 是项目文件夹的路径。后续对 editprojectfiles 的调用将引用始终相同的 $DIR 目录。

答案2

每次尝试访问文件时,您都可以搜索它。locate如果您有它,请使用:

alias editprojectfiles='edit "$(locate -n 1 "afile.txt")"'

笔记:-n限制结果。在某些系统上,它-l代替。请参阅您的locate手册页。

笔记locate使用定期更新的数据库,但并非始终保持最新状态。更新频率取决于您的系统。如果您需要最新的文件位置,请使用find


稍微慢一点(但可能更通用?)的方法是使用find

alias editprojectfiles='edit "$(find ~ -name "afile.txt" -print -quit)"'

~您可以通过缩小搜索范围、比根目录更具体或控制深度来加快速度。

或者

为了防止搜索每一个每次使用别名时,您可以在登录时进行一次搜索,它将在您的会话期间保留。为此,在您的别名文件中,使用locatefind并将其分配给变量,然后在别名中使用该变量:

AFILE="$(find ~ -name "afile.txt" -print -quit)"
alias editprojectfiles="edit \"$AFILE\""

笔记:双引号允许变量扩展。

但是,如果您在会话中移动文件,则不会跟踪文件。但如果您开始新的会话,新位置将会更新。

相关内容