【问题标题】: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 文件放在那里。

我的尝试

  1. 'ls -t $DL/*.csv | head -1'(有效)
  2. 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 来评估表达式并获得结果。

      【讨论】:

        猜你喜欢
        • 2015-02-28
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 2015-10-07
        • 2021-12-20
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多