有没有办法为 x 小时设置环境变量

Is there a way to set environment variable for x hours

正在尝试创建一个将在设定时间后过期的环境变量。

用例:
我在终端上登录服务,我想保存例如ACC_ID=123456 到环境变量,然后在终端提示中打印出来:

(123456)-(name)$

使用以下 fish 方法设置 acc_id 环境变量:

function acc_id
    cd /path/to/script/
    ./login_to_service.sh $argv
    set -Ux ACC_ID $argv
    cd -
end

ACC_ID 一直持续到我重新运行 acc_id 函数

1 小时后,我希望它执行以下操作之一:

我可以设置一个计划任务来执行此操作,但我想知道是否有更合适的或内置的方式。

fish 有一个内置的 event-oriented 系统。您可以编写一个在事件发生时触发的触发器。一个这样的事件是当进程退出时。所以:

  • 在您的函数中,创建一个休眠 1 小时的后台进程
  • 添加一个在后台进程结束时执行的函数
  • 该函数将取消设置环境变量:
function acc_id
    cd /path/to/script/
    ./login_to_service.sh $argv
    set -Ux ACC_ID $argv
    cd -
    # the magic
    sleep 1h &
    function _unset_accid --on-process-exit (jobs --last --pid)
        set -e ACC_ID
        functions -e (status function)
    end
end

我删除了内部函数中的函数:它会在 pid 号退出的任何时候触发,所以我们不希望它徘徊等待 任何 具有该 pid 的进程。

这是一个演示:

$ function set_var_for_a_while
      set -gx MYENVVAR "variable value created "(date '+%s')
      sleep 5 &
      function _unset_my_var --on-process-exit (jobs --last --pid)
          set -e MYENVVAR
          functions -e (status function)
      end
  end

$ set_var_for_a_while; type _unset_my_var; for i in (seq 6); printf "%s\t%s\n" (date) $MYENVVAR; sleep 1; end; type _unset_my_var

输出:

_unset_my_var is a function with definition
function _unset_my_var --on-process-exit 68077
    set -e MYENVVAR
    functions -e (status function)
end
Mon Jun 24 10:21:51 EDT 2019    variable value created 1561386110
Mon Jun 24 10:21:52 EDT 2019    variable value created 1561386110
Mon Jun 24 10:21:53 EDT 2019    variable value created 1561386110
Mon Jun 24 10:21:54 EDT 2019    variable value created 1561386110
Mon Jun 24 10:21:55 EDT 2019    variable value created 1561386110
Mon Jun 24 10:21:56 EDT 2019
type: Could not find '_unset_my_var'