我正在尝试创建一个 bash 别名来执行以下操作:
- 创建一个文件夹(以当前日期作为文件夹名称)
- 将文件从当前文件夹移动(或复制,对我来说都可以)到新文件夹中。
文件名作为变量传递给别名。例如,my-alias file.txt
以下是我尝试过的一些方法(尽管我尝试了更多的变体):
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 './$(date +%F)-List/$1' && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 ./$(date +%F)-List/$1 && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cd '$(date +%F)-List' && cp ../$1 ./$1"
我尝试了很多编写命令的方法,但都不起作用。
我在看什么?
这是在 Mac 操作系统上,应该与大多数其他 Linux 环境相同。
更新:我哪里出错了
我已经意识到我在哪里感到困惑了。我设置了很多别名“似乎”来接收参数。我很久以前(几年前)就设置了它们。我现在意识到别名似乎只接收参数,因为别名可以处理在命令行输入时跟随的任何内容。但它只会处理那些位于别名引用的命令字符串末尾且顺序相同的“参数”。因此,一旦我开始尝试在别名命令字符串中调整参数,别名就会中断。所以是的,最好的方法是使用函数。
答案1
如果必须使用别名,可以使用 -t 在要移动的文件的实际参数之前指定目标目录:
alias my-alias="mkdir \$(date +%F); mv -t \$(date +%F)"
可以在 Linux 上运行,但我没有 MacOS 机器来测试。
答案2
使用函数而不是别名。如果您在使用别名时遇到问题,这几乎总是答案。特别是如果您尝试使用参数(例如$1
),因为别名实际上并不接受参数。
另外,您几乎应该始终在参数和变量引用周围加上双引号(即"$1"
而不只是$1
)。并且不要运行date
多次,因为有可能(如果不太可能)您会得到不同的结果;运行一次并将结果存储在变量中。尝试这个:
my-function() {
local subdir="$(date +%F)-List"
mkdir -v -p "$subdir" &&
cp "$1" "$subdir/$1" &&
cd "$subdir"
}
答案3
正如其他问题的答案所示:别名不擅长处理参数。你甚至可以看到:
param=foo; do something with "$param"
这就是参数的工作原理:首先(在时间和命令行中)设置它们,然后使用它们。与此相反:
<alias string with several commands to be expanded> <parameter>
该参数可以是别名中最后一个命令的参数。那不是你需要的。
您可以通过从 shell 的角度将别名构建为单个命令来使用别名来完成此操作,但这是否是一种有用的方法是值得怀疑的:
alias testalias='bash -c "echo \$1; echo \$1-" bash'
$ testalias foo
foo
foo-
反对它的一个论点是引用很复杂。就连我也先犯了这个错误。
答案4
您需要创建一个函数。mkdir -v -p '$(date +%F)-List'
仅在创建别名时进行评估