我在我的 bash 启动脚本中设置了以下函数:
# Date Time Stamp
dts() { date +%Y-%m-%d-%H-%M-%S; }
# Date mkdir
dmkdir() { mkdir $(dts); }
我主要在命令行上使用它们,如果你想在脚本中运行它们,你必须获取启动脚本或在脚本中定义 shell 函数。如果你想在前面加上一个名字(例如mydir
),你可以很容易地给它一个像这样的参数:
# Date mkdir
dmkdir() { mkdir "$@$(dts)"; }
这将被称为:
$ dmkdir mydir
$ ls -d mydir*
mydir2012-05-18-11-38-40
这确实意味着如果您的参数列表包含空格,它们将显示在目录名称中,这可能是也可能不是一件好事。
您可以在 shell 函数内部分配一个 shell 变量,这可以在函数外部访问:
dmkdir() { newdir="$@$(dts)"; mkdir $newdir; }
像这样使用:
$ dmkdir mydir
$ cd $newdir
$ pwd
/tmp/mydir2012-05-18-12-54-32
这非常方便,但是您必须注意以下几点:1)您正在污染您的命名空间——您可能会覆盖一个名为$newdir
由不同进程创建的 shell 变量 2)很容易忘记哪个变量 dmkdir 将写入,特别是如果你有很多 shell 函数写出变量。一个好的命名约定将对这两个问题有很大帮助。
另一种选择是让 shell 函数回显目录名称:
dmkdir() { local newdir="$@$(dts)"; mkdir $newdir && echo $newdir; }
这可以如下调用:
newdir="$(dmkdir mydir)"
local
意味着这$newdir
在 dmkdir 之外不可用,这是一件好事(TM)。
的使用&&
意味着只有在目录创建成功时才回显目录的名称。
该$()
语法允许您加载任何回显到 STDOUT 的内容以加载到变量中,并且单引号确保如果目录名称中有任何空格,它仍然会加载到单个变量中。
这解决了先前解决方案中固有的命名空间污染问题。