【问题标题】:Saving an *expression* to a shell variable, not the *result* of an expression将 *expression* 保存到 shell 变量,而不是表达式的 *result*
【发布时间】:2018-08-29 17:38:32
【问题描述】:
问题:
我想通过键入$LATEST 在下载文件夹中获取最新的 csv 文件。当我取消引用$LATEST 时,我想看到最后一个 csv 文件放在那里。
我的尝试:
-
'ls -t $DL/*.csv | head -1'(有效)
export $LATEST='ls -t $DL/*.csv | head -1'
2. 的问题是它总是在运行导出时返回最新的文件。 (例如old.csv)当我添加一个新文件时(例如new.csv)我希望$LATEST显示new.csv而不是old.csv。
【问题讨论】:
标签:
bash
shell
environment-variables
sh
zsh
【解决方案1】:
如果你可以使用zsh,那就简单多了:
$ latest () { print "$DL"/*.csv(om[1]) }
glob 限定符om 按日期对"$DL"/*.csv 的扩展进行排序; [1] 选择排序扩展的第一个元素。
这避免了对包含换行符的文件名的任何担忧,这就是为什么理论上应该避免解析 ls 的输出的原因。
【解决方案2】:
变量不跟踪系统状态的变化。他们有价值观。这些值会一直存在,直到您更改它们。如果您想以类似变量的方式访问当前状态,请使用函数。示例:
latest() {
ls -t $DL/*.csv | head -1
}
echo "The latest file is $(latest)"
if [ "new.csv" = "$(latest)" ]; then
echo "Hooray, new is latest!"
fi
另一个好处是函数可以接受参数。例如,如果你想让你的 latest 函数通用,但有合理的默认值,你可以这样做:
latest() {
ls -t ${1:-$DL}/*.csv | head -${2:-1}
}
latest # show the 1 latest file from $DL directory
latest /tmp # show the 1 latest file from /tmp
latest /tmp 5 # show the five latest files from /tmp
在这种情况下
【解决方案3】:
环境变量不会自动更新,它只是存储值。但是你可以定义一个函数,每次调用它时都会从 1. 开始计算表达式:
function latest {
ls -t $DL/*.csv | head -1
}
现在,如果您将其放入您的~/.bashrc 并重新加载,您可以调用latest 来评估表达式并获得结果。