met*_*ion 46 command-line shell io-redirection
我想知道如何重用控制台的最后一个输出,即:
pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/Library/Python/2.6/site-packages
pv-3:method Xavier$ cd **LASTOUTPUT**
Run Code Online (Sandbox Code Playgroud)
jsb*_*ngs 41
假设 bash:
% python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.7/site-packages
% cd $(!!)
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
% pwd
/usr/lib/python2.7/site-packages
Run Code Online (Sandbox Code Playgroud)
gle*_*man 12
还没有提到,使用一个变量:
dir=$( python -c ... )
cd "$dir"
Run Code Online (Sandbox Code Playgroud)
所有其他解决方案都涉及修改您的工作流程或两次运行命令,如果运行时间过长或不可重复(例如,它会删除文件 - 重新运行会产生不同的结果),则这可能不适合。
因此,如果您需要,这里有一个更复杂的想法:
.bashrc
exec > >(tee -a ~/$$.out)
PROMPT_COMMAND='LASTLINE=$(tail -n 1 ~/$$.out)'
trap 'rm ~/$$.out' EXIT
Run Code Online (Sandbox Code Playgroud)
bash 提示
$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.6/dist-packages
$ cd $LASTLINE
$ pwd
/usr/lib/python2.6/dist-packages
Run Code Online (Sandbox Code Playgroud)
这有一些问题,所以它只是作为一个起点。例如,输出文件 ( ~/<pid>.out
) 可能会变得非常大并填满您的磁盘。此外,如果tee
死机,您的整个外壳可能会停止工作。
可以修改它以仅捕获使用zsh 中的preexec
和precmd
钩子的前一个命令的输出,或在 bash 中对它们的模拟,但这在此处描述更复杂。
传统 shell 的工作草案:
ttyid=$(readlink /proc/$$/fd/1)
\___/ \______/ \___/ | | |
| | | | | \- 0: stdin
| | | | | 1: stdout <- our interest
| | | | | 2: stderr
| | | | \- fd is, maybe, filedescriptor
| | | |
| | | \- $$ is the PID of the current process (shell,
| | | in our case)
| | |
| | \- you know, much runtime stuff is here
| |
| \- readlink extracts the symbolic link of /proc/$$/fd/1
| lrwx------ 1 stefan stefan 64 2011-03-18 09:11
| /proc/22159/fd/1 -> /dev/pts/4
|
\- /dev/tty3 for real shell, /dev/pts/3 for xterm
Run Code Online (Sandbox Code Playgroud)
现在我们可以将屏幕转换为文件。需要 sudo。
id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump
Run Code Online (Sandbox Code Playgroud)
Apropos screendump
:如此命名的程序不再适合我。也许仅适用于较旧的内核。/dev/pts/N 对我也不起作用。也许您必须在 /dev 中使用一些可选的 MKDEV - 我对 some 记忆犹新/dev/cuaN
,但我可能错了。
我们希望通过管道输出而不是使用 screen.dump。但不知何故它不起作用 - 有时它会等待 ENTER。
捕获不是带有换行符的普通文本文件,而是带有 - 例如 - 一个序列中的 80x50 个字符。
要选择最后两行,其中 1 行用于命令输出,另一行用于提示行,我将其还原,选择 160 个字符,再次还原并选择 80。
rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'
Run Code Online (Sandbox Code Playgroud)
以防万一你想知道为什么会有一个rev
程序。
批判:
第一张图是用explain.py制作的
尝试这个:
$ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
$ pwd
/Library/Python/2.6/site-packages
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
44965 次 |
最近记录: |