将*表达式*保存到shell变量,而不是表达式的* result *

时间:2018-03-20 18:55:01

标签: bash shell environment-variables sh zsh

问题

我想通过输入$LATEST来获取下载文件夹中的最新csv文件。当我取消引用$LATEST时,我想看到放在那里的最后一个csv文件。

我尝试了什么

  1. 'ls -t $DL/*.csv | head -1'(此作品)
  2. export $LATEST='ls -t $DL/*.csv | head -1'
  3. 2.问题是它总是在运行导出时返回最新文件。 (例如old.csv)当我添加新文件(例如new.csv)时,我希望$LATEST显示new.csv而非old.csv

3 个答案:

答案 0 :(得分: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

在这种情况下

答案 1 :(得分:2)

环境变量不会自动更新,只会存储值。但是你可以定义一个函数来评估每次调用它时的表达式:

function latest {
  ls -t $DL/*.csv | head -1
}

现在,如果您将其放入~/.bashrc并重新加载,则可以调用latest来评估表达式并获得结果。

答案 2 :(得分:2)

如果您可以使用zsh,那就容易多了:

$ latest () { print "$DL"/*.csv(om[1]) }

glob限定符om按日期对"$DL"/*.csv的扩展进行排序; [1]选择排序扩展的第一个元素。

这避免了对包含换行符的文件名的任何担心,这就是为什么理论上应该避免解析ls的输出的原因。