我正在运行以下命令来为整个脚本文件夹添加别名:
ls | grep '\.sh$' | sed 's/\.sh$//' | awk '{print "alias "$1"=\"./"$0".sh\""}' | xargs -L1 bash
似乎有问题,bash
或者可能xargs
处理这个问题。别名不起作用。
使用 运行命令时echo
,我得到了预期的输出(或者几乎不确定为什么缺少双引号)
ls | grep '\.sh$' | sed 's/\.sh$//' | awk '{print "alias "$1"=\"./"$0".sh\""}' | xargs -L1 echo
输出:
alias test_script1=./test_script1.sh
alias test_script2=./test_script2.sh
单独运行时,这些命令按预期工作。
抱歉,如果我仍然是一个 bash 菜鸟。尝试通过一个命令来解决这个问题,我可以将其放入我的.zshrc
脚本目录中并引用它。
xargs -L1 bash
运行例如bash alias test_script=/test_script.sh
。Bash 将尝试运行命令alias
,但这不是您想要的 - 您需要一个内置的 shell。为此,您需要bash -c
.如果您运行,它将为每个别名
xargs -L1 bash -c
运行一个不同的实例。bash
实例立即结束,其中定义的别名不会影响当前 shell 中定义的别名。要在当前 shell 中运行别名,请改用
eval
:请注意,别名只能在当前目录中使用,一旦您
cd
在其他目录中,它们很可能会损坏。使用完整路径而不是./script
修复它。一种更安全、更标准的方法是重命名文件,删除
.sh
(或者如果需要原始名称则创建链接)并将目录添加到环境变量中$PATH
。您可以获得您正在寻找的效果
.sh
. — 这删除了.sh
PATH
. — 这会删除./
并允许在任何目录中使用。如果由于某种原因无法
.sh
从文件名中删除 。然后创建到原始链接的同步链接,而原始链接没有它。文件扩展名违背了 Unix 哲学:想象一下用另一种语言重写其中一个程序。您必须告诉程序的所有客户端更改用于运行该程序的名称。
为了达到预期的效果,您可以通过删除 .sh 扩展名来重命名文件,然后将目录添加到 PATH 中。如果由于特定原因无法从文件名中删除 .sh,则可以创建指向不带 .sh 扩展名的原始文件的符号链接。