【问题标题】:use alias only once in bashrc在 bashrc 中只使用一次别名
【发布时间】:2012-03-22 11:21:18
【问题描述】:

我在我的 .bashrc 文件中写了一个别名,每次我启动 bash shell 时都会打开一个 txt 文件。 问题是我只想打开一次这样的文件,那是我第一次打开shell。

有什么办法吗?

【问题讨论】:

  • 我不明白这个问题的动机。如果您希望仅在第一次登录时执行命令,请将它们放在 .login.bash_login 中,只有当它们是登录 shell 时才会由类似 sh 的 shell 执行,这与由两个登录执行的 .bashrc 不同和非登录 bash shell。
  • 我尝试编辑这些文件,但没有成功。我刚刚输入了命令 'gvim path/file.txt',然后当我开始 bash 会话时什么也没发生。
  • 同意您可能应该尝试解决该问题,或者同时解决。发表一个单独的问题!
  • 您使用的是 Mac OS 吗? Terminal.app 具有每次启动时调用登录 shell 的奇怪行为。您可以通过查看 TERM_PROGRAM 的内容来测试您是否在这样的 shell 中。在 MacOS 中,open 命令允许您避免多次打开同一个文件。
  • 我使用的不是 Mac OS,而是 Linux Scientific。无论如何,似乎我发现了问题(在互联网上查找)。我正在处理 X 会话,这意味着我运行的不是登录 bash shell,而是一个简单的 shell,它不读取 .login 或 .bash_login,而是直接读取 .bashrc。但无论如何,感谢你们两位有用的 cmets。我会尝试改变策略。

标签: bash


【解决方案1】:

此问题的一般解决方案是使用某种会话锁定。您可以使用正在编辑另一个文件的进程的 pid 和/或 tty 创建一个文件 /tmp/secret,并在完成后删除锁定文件。现在,您的其他会话应该设置为不创建该文件(如果它已经存在)。

正确的锁定是一个复杂的话题,但对于简单的情况,这可能已经足够了。如果没有,请谷歌搜索“互斥”。请注意,如果您弄错了,可能会有安全隐患。

为什么要为此使用别名?听起来代码应该直接在您的 .bashrc 中,而不是在别名定义中。

如果你现在在.bashrc 中拥有类似

alias start_editing_my_project_work_hour_report='emacs ~/prj.txt &̈́'
start_editing_my_project_work_hour_report
unalias start_editing_my_project_work_hour_report

...然后使用锁定,并且没有别名,您最终可能会得到类似

# Obtain my UID on this host, and construct directory name and lock file name
uid=$(id -u)
dir=/tmp/prj-$uid
lock=$dir/pid.lock

# The loop will execute at most twice,
# but we don't know yet whether once is enough
while true; do
  if mkdir -p "$dir"; then
     # Yay, we have the lock!
     ( echo $$ >"$lock" ; emacs ~/prj.txt; rm -f "$lock" ) &
     break

  else
     other=$(cat "$lock")

     # If the process which created the UID is still live, do nothing
     if kill -0 $other; then
       break
     else
       echo "removing stale lock file dir (dead PID $other) and retrying" >&2
       rm -rf "$dir"
       continue
     fi
  fi
done

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 2021-09-24
    • 1970-01-01
    • 2018-07-07
    • 2015-03-28
    • 2011-07-19
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多