我想将一个别名文件添加到我的项目文件夹中,以便使用简单的 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)"'
~
您可以通过缩小搜索范围、比根目录更具体或控制深度来加快速度。
或者
为了防止搜索每一个每次使用别名时,您可以在登录时进行一次搜索,它将在您的会话期间保留。为此,在您的别名文件中,使用locate
或find
并将其分配给变量,然后在别名中使用该变量:
AFILE="$(find ~ -name "afile.txt" -print -quit)"
alias editprojectfiles="edit \"$AFILE\""
笔记:双引号允许变量扩展。
但是,如果您在会话中移动文件,则不会跟踪文件。但如果您开始新的会话,新位置将会更新。