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

时间:2019-06-24 13:04:55

标签: linux fish

尝试创建一个环境变量,该变量将在设置的时间后失效。

用例
我登录到终端上的服务,我想保存例如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小时后,我希望它执行以下操作之一:

  • ACC_ID设置为环境变量
  • ACC_ID设置为空字符串

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

1 个答案:

答案 0 :(得分:2)

鱼具有内置的面向事件的系统。您可以编写触发事件发生时触发的触发器。这样的事件之一是进程退出时。所以:

  • 在您的函数中,创建一个休眠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上等待 any 进程。

这是一个演示:

$ 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'