【问题标题】:Bash alias create current timestamp in filenameBash 别名在文件名中创建当前时间戳
【发布时间】:2018-06-16 00:24:58
【问题描述】:

首先,我在这里阅读了这篇文章: Bash alias create file with current timestamp in filename

但是,当我运行它时,我一直得到相同的时间戳。这对我来说毫无意义。

我在 Windows 10 上运行 Git bash(来自 git 2.16.2)。我在 ~/.bash_aliases 中添加了以下行: alias logfile="adb logcat -v threadtime *:V | tee /c/Users/username/Desktop/adb-logs/'$(date +%Y-%m-%d@%Hh%Mm%Ss)'-FullLogCat.log"

这似乎创建了一个日志文件并按照我的意愿在屏幕上显示 ADB 日志。但是,实际日期似乎在加载终端的同时“卡住”了。例如,我在下午 2:29:09 加载终端,然后等到下午 2:30:00 调用别名,文件被标记为“2018-04-24@14h29m09s-FullLogCat.log”。似乎配置文件将别名加载到内存中时,它执行了日期函数。

有没有办法防止这种情况发生?这只是一个奇怪的 git bash 事情吗?

更新:解决方案

alias logfile='adb logcat -v threadtime *:V | tee /c/Users/ghannan/Desktop/adb-logs/''$(date +%Y-%m-%d@%Hh%Mm%Ss)''-FullLogCat.log

【问题讨论】:

    标签: bash git date adb


    【解决方案1】:

    这真的应该是一个函数(因为你应该问自己的问题是“有什么理由这个不能是一个函数吗?”):

    logfile () {
        dt=$(date +%Y-%m-%d@%Hh%Mm%Ss)
        output="/c/Users/username/Desktop/adb-logs/$dt-FullLogCat.log"
        adb logcat -v threadTime *:V | tee "$output"
    }
    

    来自bash 手册页:

    对于几乎所有用途,别名都被 shell 函数所取代。

    【讨论】:

      【解决方案2】:

      使用单引号来防止命令替换,直到别名被实际执行。

      alias logfile='adb logcat -v threadtime *:V | tee /c/Users/username/Desktop/adb-logs/$(date +%Y-%m-%d@%Hh%Mm%Ss)-FullLogCat.log'
      # ............^................................................................................................................^
      

      【讨论】:

        【解决方案3】:

        您需要对别名中的$ 进行转义,以便在每次调用别名时运行 date 命令。目前它仅在您创建别名时运行。

        编辑:您还需要删除 date 扩展周围的单引号,正如该线程中的其他人所指出的那样。

        $ alias logfile="adb logcat -v threadtime *:V | tee /c/Users/username/Desktop/adb-logs/'$(date +%Y-%m-%d@%Hh%Mm%Ss)'-FullLogCat.log"
        $ alias | grep adb
        alias logfile='adb logcat -v threadtime *:V | tee /c/Users/username/Desktop/adb-logs/'\''2018-04-24@13h39m08s'\''-FullLogCat.log'
        

        你可以在上面看到,没有转义$,日期被硬编码到别名中。

        $ alias logfile="adb logcat -v threadtime *:V | tee /c/Users/username/Desktop/adb-logs/\$(date +%Y-%m-%d@%Hh%Mm%Ss)-FullLogCat.log"
        $ alias | grep adb
        alias logfile='adb logcat -v threadtime *:V | tee /c/Users/username/Desktop/adb-logs/'\''$(date +%Y-%m-%d@%Hh%Mm%Ss)'\''-FullLogCat.log'
        

        在这个例子中,我们已经转义了$,它现在是别名的一部分,将按预期运行

        HTH

        【讨论】:

        • 谢谢,我试过了,但由于某种原因它不起作用。我查找了转义引号(根据您的建议)并使用它: alias logfile='adb logcat -v threadtime *:V | tee /c/Users/ghannan/Desktop/adb-logs/''$(date +%Y-%m-%d@%Hh%Mm%Ss)''-FullLogCat.log' 在此处找到更多信息:@987654321 @
        • 这个答案中的版本不起作用的原因是它在命令扩展周围放置了单引号(即它有...'$(date ...)'...),而单引号阻止了命令扩展的运行.有效的版本在它周围有双引号,它允许命令和变量扩展。顺便说一句,我实际上建议通过使用函数而不是别名来避免所有引用混淆——请参阅chepner's answer here
        • 或者在下面查看我的答案:)
        • 是的,单引号也需要删除。更新答案以反映
        猜你喜欢
        • 2014-08-05
        • 2011-11-21
        • 2015-10-09
        • 1970-01-01
        • 2011-04-27
        • 2018-12-28
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        相关资源
        最近更新 更多