[译] 如何防止丢失任何 bash 历史命令?

原文链接: http://mywiki.wooledge.org/BashFAQ/088
译者: Felix Yan

注: 这个方法是为了让你保存一个用户的完整命令记录; 它不是用来对用户输入的命令做安全审计的 – 对这个用途, 请阅读提升 bash 安全-防止命令历史被移除 (英文)

默认情况下, bash 只在退出的时候更新命令历史, 而且这个”更新”是用新版直接覆盖旧版. 这会使你无法保持一份完整的命令历史记录, 原因有两个:

  • 如果一个用户登录多次, 这种覆盖的机制会使得只有最后一个退出的 bash 能保存它的历史记录. (一个登录的用户打开多个终端模拟器, 或者使用 screen/tmux 等工具启动多个 bash 等也在此列 – 译者注)
  • 如果你的 bash 异常退出了 – 比如网络故障, 防火墙更改, 或者它的进程被杀掉了 – 会话中所有的历史记录都会丢失.

为了解决前一个问题, 我们设置命令行选项 histappend 来采用”追加”的方式写入新的命令历史记录, 并保证了多次登录不会覆盖彼此的历史记录.

为了使得命令历史记录不因为 bash 异常退出而丢失, 我们需要保证每次命令之行后, 对应命令的历史记录就被写入. 我们可以用 bash 内置的 history -a 命令来强制立刻写入命令历史记录, 而且我们可以将这个命令添加到 PROMPT_COMMAND 环境变量中, 使得这个过程自动化. 这个环境变量会在每次新的命令提示符出现前被执行一次, 因此会在每个命令执行后被执行.

Continue reading [译] 如何防止丢失任何 bash 历史命令?

一句话检查自己 Arch 里装的 AUR 包是否和社区同步

我们知道 aurget yaourt 等工具可以解决普通升级的情况, 但是如果一个包改名了, 或者(不靠谱的)维护者降级了没加前置version, 这些工具不会给出任何提示. 如果没有关注自己使用的包的 comments (没有notify) 以及 aur-general 邮件列表的话, 常常会错过这样的信息, 以致自己机子上的包过期很久也没发现, 以后出现莫名其妙的问题什么的(

举例来说, aur/qtcreator-bin 被收入 [community] 一段时间了, 因为收入后改了名 (新名称是 qtcreator), 导致 yaourt 没有给我任何提示. 今天用下面的语句检查后我才发现, 自己机子里的 qtcreator-bin (版本2.3) 包已经不在 AUR 里了, 而[community-testing]/qtcreator 版本是2.6.0beta, 可见我这里的包已经过期许久.

和上次的小脚本一样, 我又用到了 GNU Parallel, 嗯就是这样(

pacman -Qmq | parallel 'ver=($(package-query {} -AQ -f "%l")); [[ "${ver[0]}" != "${ver[1]}" ]] && echo {} ${ver[0]} != ${ver[1]}'

简单的 Arch 第三方软件源自动化同步上传工具

首先解释下, 这玩意是给包维护者用的, 不是给普通用户的(
功能: 扫描自己维护的包列表, 同步所有包到远程软件仓库. 自动判断architecture. 如使用 yaourt, 需要配置 yaourt 输出到 pacman 目录, 或者手动修改工具里的路径.
PKGLIST格式: 一行一个包名.
PS: 因为用到了 GNU Parallel, 所以记得装一下嗯(

packageupload:

#!/bin/bash
[[ "$1" = *x86_64* ]] && ARCH=x86_64 || ARCH=any
echo "Uploading $1 to repo, architecture: $ARCH"
rsync -azP $1 root@$SERVER_IP:/home/www/repo/$ARCH/

packagesync:

#!/bin/bash
cat /path/to/PKGLIST|xargs pacman -Q|sed -e "s/\\s/-/"|xargs -IQ bash -c "ls /var/cache/pacman/pkg/Q-*"|parallel packageupload

给 Systemd 的操作加上 Bash 简写及其自动完成

大家都知道 systemd 启个服务打 systemctl start nginx.service 实在是长的难受(尽管有Tab…), 于是 ArchWiki 上有介绍一个简单用 start nginx 来代替的方法, 但是这个方法没有 Bash 自动补全, 于是我自己折腾了一下..

补全函数都取自他们各自原来的 bash-completion 文件, 我只修改了一点点(可惜不能复用啊..).

嗯, 照例上代码…
/etc/bash.bashrc, 或者 ~/.bashrc 里添加:

if ! systemd-notify --booted; then  # not using systemd
  start() {
    sudo rc.d start $1
  }

  restart() {
    sudo rc.d restart $1
  }

  stop() {
    sudo rc.d stop $1
  }
else
  _target() {
    if [[ "$1" == *.service ]]
    then
      echo $1
    else
      echo $1.service
    fi
  }
  export -f _target

  start() {
    sudo systemctl start $(_target $1)
  }
  export -f start

  restart() {
    sudo systemctl restart $(_target $1)
  }
  export -f restart

  stop() {
    sudo systemctl stop $(_target $1)
  }
  export -f stop

  enable() {
    sudo systemctl enable $(_target $1)
  }
  export -f enable

  status() {
    sudo systemctl status $(_target $1)
  }
  export -f status

  disable() {
    sudo systemctl disable $(_target $1)
  }
  export -f disable
fi
Continue reading 给 Systemd 的操作加上 Bash 简写及其自动完成
QR Code Business Card