Spa*_*awk 9 linux terminal bash shell command-line
我有时将路径复制粘贴到终端中,并且经常不小心复制换行符。例如,我想查找然后阅读foobar.txt.
$ locate foobar.txt
/home/sparhawk/Document Directory/foobar.txt
Run Code Online (Sandbox Code Playgroud)
然后我点击三次选择第二行。(糟糕,它也选择了尾随的换行符!)由于路径中有空格,我需要用引号将路径括起来。因此输入
$ cat '
Run Code Online (Sandbox Code Playgroud)
并单击鼠标中键进行粘贴。这产生
$ cat '/home/sparhawk/Document Directory/foobar.txt
>
Run Code Online (Sandbox Code Playgroud)
因为我在关闭'. 此时,我无法按退格键删除换行符。有没有办法删除这个刚刚输入的换行符?
在这一点上,我可以SIGINT使用Ctrl+ c,也可以使用另一个'. 假设我做后者。
$ cat '/home/sparhawk/Document Directory/foobar.txt
> '
cat: /home/sparhawk/Document Directory/foobar.txt
: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为我刚刚输入了一个包含换行符的路径。但是,此时,我可以按向上箭头来加载最后一个命令。IE
$ cat '/home/sparhawk/Document Directory/foobar.txt
'
Run Code Online (Sandbox Code Playgroud)
此时,我可以按两次退格键删除换行符。(注意>,在第二个历史示例中没有。)
Bash 使用GNU Readline 库进行命令行输入和编辑。不幸的是,这个库只逐行处理输入。readline()按 完成该行后,呼叫将返回Enter。下一行(在显示$PS2“ >”提示后)由单独的readline()调用处理。
当您在编辑历史记录中返回多行输入时,Readline 将输入视为带有换行符的单个“行”($PS2不显示提示),因此您可以按照您的描述编辑整个多行输入。
我使用以下技巧来解决您提出的问题:当我输入不需要的换行符时,我按Ctrl+取消它c。然后我按?(或Ctrl+ p)返回到取消的输入。然后我可以删除换行符Backspace并进行其他编辑。
在末尾输入不需要的换行符,按Ctrl+ c:
$ cat 'xyz
> ^C
Run Code Online (Sandbox Code Playgroud)
在?没有尾随换行符的情况下按下输入返回事件后:
$ cat 'xyz
Run Code Online (Sandbox Code Playgroud)