【问题标题】:strange behavior of fc -l commandfc -l 命令的奇怪行为
【发布时间】:2011-01-04 13:54:04
【问题描述】:

我有两台 unix 机器,都运行 AIX 5.3
我的 $HOME 安装在 machine1 上。
使用 NFS,登录 machine2 将转到相同的 $HOME

我先登录 machine2,然后登录 machine1。
两者都使用远程登录。

两个会话将共享同一个 .sh_history 文件。

我发现 fc -l 的行为很奇怪。

在 machine2 中,我在 telnet 中发出命令:

fc -l  
ksh fc -l

两者都提供相同的输出。

在机器 1 中,

fc -l  
ksh fc -l 

给出不同的结果
ksh fc -l 的结果 与/usr/bin/fc -l相同

另外,当我运行这样的脚本时:

#!/usr/bin/ksh  
fc -l 

结果和/usr/bin/fc -l一样

谁能告诉我发生了什么?

萧亚文

【问题讨论】:

    标签: unix shell ksh


    【解决方案1】:

    啊,古人的智慧……(因为这个帖子已经有一年多了。)

    无论如何,我刚刚在 Solaris 10 中遇到了这个问题。问题似乎是这样的:当您在 /etc/profile/etc/profile 调用的任何文件中定义函数时,您的 HISTFILE 变量会被 Korn 忽略shell,而 shell 在访问其历史记录时使用 ".sh_history"。不知道为什么会这样。

    结果是您看到了其他 root shell 的命令。您可以使用以下方法对其进行测试:

    lsof -p $$
    

    cat /proc/$$/fd/63
    

    【讨论】:

      【解决方案2】:

      有可能登录 shell 不是 ksh 或者 $HISTFILE 正在被重置。您可以做的一件事是echo $HISTFILE 在各种情况下,看看它是否不同。要检查的另一件事是查看您使用ps 使用的shell。

      例如,Bash(默认 $HOME/.bash_history)与 ksh(默认 $HOME/.sh_history)的 $HISTFILE 不同。

      造成这种差异的另一个可能原因是内置 fc 可能能够看到尚未写入磁盘的内存中历史记录(外部 /usr/bin/fc 无法看到)。如果这是真的,它可能是版本相关的。例如,Bash 在 shell 退出之前不会将历史记录写入文件。 Ksh(至少我正在使用的版本)会立即写入。

      【讨论】:

      • 我确定我正在运行 ksh。我确信 $HISTFILE 没有设置。因为 /etc/profile 调用了一个使用函数的脚本,这使得 ksh 写入命令历史文件 .sh_history。我的 .profile 无法使用 HISTFILE 变量覆盖命令历史记录。所以,我根本不设置 HISTFILE。因此,该结论可能是由于内存中的历史。有什么办法可以强制我的登录 ksh 不使用内存历史记录?
      • @Alvin:我认为 ksh 会立即写入历史文件(这只是 Bash 的问题)。只有交互式 shell(通常)写入历史文件 - 脚本通常不会。你到底看到了什么,你想要做什么?当您说使用函数的脚本在从 /etc/profile 调用时导致 ksh 写入历史文件时,您指的是什么?我没有看到这种行为。
      • 我的意思是我们必须在函数调用/定义之前设置 $HISTFILE。由于 /etc/profile 调用了一些定义函数的脚本,这使得 /etc/profile 使用 .sh_history 作为我的登录 shell。我无法使用 $HISTFILE 覆盖我的 .profile 中的命令历史文件。 ---------- 我到底看到了什么?实际上, fc -l 在每个命令之前都会有一个数字。 fc -l 给出一个数字 3xx。 /usr/bin/fc -l 给出一个数字 1xx。这就是为什么我还怀疑内存中的历史还没有写入 .sh_history
      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2012-04-05
      • 2012-06-21
      • 2022-01-05
      • 2015-12-07
      • 2015-01-11
      相关资源
      最近更新 更多