我想看看一周前的某一天我在 bash 命令行上输入了什么。有没有办法检索命令行历史记录?也许像下面这样?
> history --include-date | grep 2012-02-27`
Run Code Online (Sandbox Code Playgroud) 在命令完成后是否有相当于 zsh 的 precmd 来执行功能?
我正在寻找一种方法来向自己发送超过 60 秒的任何进程的通知。如果命令花费的时间长于 REPORTTIME 秒中设置的值,则 Zsh 具有打印用于每个命令的资源摘要的强大功能。据我所知,唯一可用的选项是在 TIMEFMT 中打印格式。
(更具体地说,如果在分离的 tmux 会话中运行的任何进程需要超过 60 秒才能完成,我希望通过https://pushover.net/向自己发送通知。)
我需要从非 BASH 脚本(即 PHP 脚本)执行许多管道 shell 命令,如下所示:
command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)
所以,如果 command1以非零退出代码失败,则每个其他命令也会失败。到目前为止,我想出的是:
set -o pipefail && command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)
但即使它从终端运行良好,如果从脚本执行它也会产生这个:
sh: 1: set: 非法选项 -o pipefail
出于某种原因,我无法让我的系统在重新启动后保留我的 BASH 历史记录。以下是我的相关部分~/.bashrc:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Run Code Online (Sandbox Code Playgroud)
据我所知,这些是所有必要的选项(我知道过去我可以在多次重新启动后保留历史记录,而过去没有所有这些)。但是,尽管在几次重新启动之前添加了这些选项,但在重新启动后我仍然丢失了大部分历史记录。它不是空的,但它没有我重新启动之前的 9999 行。
在有人抱怨之前,是的,我已经阅读了这些问题。我已经实施了他们上面列出的一些建议,其余的要么没有帮助,要么不相关:
如果那里可能有其他相关命令,您可以~/.bashrc 在此处查看我的全部内容。
那么,我错过了什么?为什么我的历史没有保存?如果有人认为另一个文件可能相关,请告诉我,我会发布它。我通过grep -i hist \.*在 my$HOME中运行来检查它显示唯一.包含字符串hist或的相关文件HIST是.bashrc.
我正在运行 Linux Mint Debian 版,GNU bash,版本 4.2.36(1)-release (x86_64-pc-linux-gnu) 和我最喜欢的终端模拟器(如果相关)是terminator.
更新:
按照@mpy 在评论中的建议,我将 my 更改 …
所以bash 手册页解释了什么是登录和交互式 shell:
登录 shell 是参数零的第一个字符是 - 或以 --login 选项开头的 shell。
交互式 shell 是一个没有非选项参数并且没有 -c 选项的启动,其标准输入和错误都连接到终端(由 isatty(3) 确定),或者一个以 -i 选项启动。如果 bash 是交互式的,则设置 PS1 并且 $- 包括 i,允许 shell 脚本或启动文件测试此状态。
我认为这意味着我们可以有 4 种不同类型的 shell:
但是为什么我们首先要有交互式/非交互式和登录/非登录 shell?为什么品种多?如果我们只有一种壳,我们会失去什么?
此外,当试图通过运行确定我是否在登录 shell 中时echo $-,它输出:
himBH
Run Code Online (Sandbox Code Playgroud)
关于这些标志的解释这里,但是h,H和m没有解释。有没有描述所有这些标志的地方?
我正在使用 bash 4.3.11(1) 并安装了以下历史插件(通过.bash_it):
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'
Run Code Online (Sandbox Code Playgroud)
当我登录到交互式会话时一切正常,但是当我通过ssh host 'ls -als'例如运行远程命令时,我看到以下输出:
: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled
Run Code Online (Sandbox Code Playgroud)
当我echo -e '\0033\0143'在每次绑定调用后修改历史插件时,我不再收到警告,但我的控制台已被清除。不是一个巨大的缺点,但知道一种更简洁的方法来抑制远程命令的这种情况会很好。
# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history …Run Code Online (Sandbox Code Playgroud) 我正在尝试将命令的输出保存到文件中。命令是:
clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt
Run Code Online (Sandbox Code Playgroud)
但是,打开时生成的 output.txt 文件(通过 ubuntu 上的 gedit 和 jedit)给了我这个:
[0;1;32mTranslationUnitDecl[0m[0;33m 0x4192020[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x4192558[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __int128_t[0m [0;32m'__int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192270[0m [0;32m'__int128'[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x41925b8[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __uint128_t[0m [0;32m'unsigned __int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192290[0m [0;32m'unsigned __int128'[0m
...
Run Code Online (Sandbox Code Playgroud)
当它真的应该是这样的:
TranslationUnitDecl 0x4e46020 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x4e46558 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x4e46270 '__int128'
|-TypedefDecl 0x4e465b8 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned …Run Code Online (Sandbox Code Playgroud) 会rm -rf *删除当前目录中的所有文件/文件夹吗?我想确保通配符*不会在上层目录中向上移动并擦除我的所有文件系统。:D
我记得chmod 777 .* -R对chmod隐藏文件做的,它chmod编辑了我所有的文件系统。显然,我使用的是 root 帐户。
我在 /etc/profile.d/alias.sh 中为每个登录 shell 设置了别名。但是如果我运行 script.sh,我就不能使用那个别名。如何为子shell或子进程设置别名?
/etc/profile.d/alias.sh
alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
Run Code Online (Sandbox Code Playgroud)