人们说你不应该在 Unix 文件命名中使用空格。是否有充分的理由不在文件名中使用大写字母(即File_Name.txtvs. file_name.txt)?或者这只是个人喜好问题?
除其他外,我在 Linux Mint 14 上使用 bash 4.2.37。
当我通过键入自动完成环境变量的名称时Tab,它会扩展为变量的名称,后跟一个空格。
如果变量的值恰好是目录名,我希望它扩展为变量名,后跟/.
例如,如果我输入:
$ ls $HOM<tab>
Run Code Online (Sandbox Code Playgroud)
它扩展为:
$ ls $HOME _
Run Code Online (Sandbox Code Playgroud)
where_标记光标的位置。问题是,我当时常常想继续我的主目录,这意味着我必须键入下键入一些文件或目录的名称backspace,然后/。
所以我希望将上述内容扩展为:
$ ls $HOME/_
Run Code Online (Sandbox Code Playgroud)
当我输入整个变量名时,也会发生同样的事情;after ls $HOME,tab添加一个空格,我希望它添加一个/.
(当然,/如果变量的值不是目录名称,我不希望它添加 a 。)
有什么方法可以告诉 bash 按照我想要的方式行事,无论是通过 bash 命令还是更新我的$HOME/.inputrc?
注意:我正在专门寻找一种方法来tab按照我想要的方式行事。用不同的击键实现相同行为的方法会很有趣,但不会回答我的问题。
(我/etc/profile.d/bash_completion.sh在我的系统上禁用了,因为它与 交互很差set -o nounset。一个快速的实验表明这可能与我的问题无关。)
顺便提一下,tcsh 是这样做的:给定一个环境变量$FOOBAR,如果它指的是一个目录,则输入$FOOBA<tab>扩展为(带空格)如果不是。不,这还不足以说服我回到 tcsh。zsh 也这样做。$FOOBAR/$FOOBAR
(背景:我是 tcsh 的长期用户,逐渐过渡到 bash,并试图找到一些有用的 tcsh 特定功能的等效项。)
在 tcsh 中,我可以定义一个执行外部命令的键绑定。例如,给定:
bindkey -c ^Gu uptime
Run Code Online (Sandbox Code Playgroud)
我可以在 tcsh 中输入“Control-G u”,它就会执行uptime命令。我不必输入 Enter,该命令不会出现在我的历史记录中,我可以在输入行的中间输入(我发现后者对某些命令特别有用)。
bash 通过 GNU readline 库具有类似的键绑定机制,绑定在$HOME/.inputrc(或其他地方)中指定。但是在阅读info readline文档后,我没有看到通过键绑定来执行外部命令的方法。
我想出的最接近的事情是将这样的内容添加到我的.inputrc文件中:
"\C-gu": "uptime\n"
Run Code Online (Sandbox Code Playgroud)
但这不会执行命令;相反,它的作用就像我输入uptime后按 Enter 键一样。该命令出现在我的历史记录中(没关系),它仅在空行上起作用;如果我输入"echo control-Gu",那么它会打印uptime而不是执行命令。
另一个小缺点是绑定会影响其他使用 GNU readline 的命令,例如 Perl 调试器。
有没有办法bindkey -c通过将键序列映射到指定外部命令的执行来模拟 tcsh在 bash 中的效果?
如果重要的话,我在 Ubuntu 12.04 beta 2 上使用 bash 4.2.24。
是否可以在命令行中查询 ~/.ssh/config?假设我想在单独的程序中检索特定别名指向的 IP 地址,这可能吗?
该ssh-add命令允许您指定添加到 的身份的生命周期ssh-agent。例如,如果我输入
ssh-add -t 1h
Run Code Online (Sandbox Code Playgroud)
身份将在 1 小时后过期。然后,我可以使用 列出代理当前代表的身份ssh-add -l。
有没有办法(除了在运行ssh-add命令时记录信息)来确定身份的剩余生命周期?如果没有,是否有一些与安全相关的原因,为什么不应该有一种方法来获取这些信息?
如果我将自己添加到一个组中,则它仅适用于新启动的进程。实际上它比这更受限制;它似乎只适用于新登录。我不确定确切的机制是什么,但这不是我的问题(尽管我对此也很好奇)。
我的问题是:是否可以在当前 shell 进程中更新我的组成员身份?
我怀疑答案是否定的。
一个例子(这不是直接复制和粘贴):
$ groups ; groups kst
kst oldgroup1 oldgroup2
kst : kst oldgroup1 oldgroup2
$ sudo adduser kst newgroup
[sudo] password for kst:
Adding user `kst' to group `newgroup' ...
Adding user kst to group newgroup
Done.
$ groups ; groups kst
kst oldgroup1 oldgroup2
kst : kst oldgroup1 oldgroup2 newgroup
$
Run Code Online (Sandbox Code Playgroud)
在 之后adduser,我的帐户是 的成员newgroup,但该成员身份并未反映在当前的 shell 进程中。
显而易见的解决方案是注销并重新登录,但这很不方便。
ls -lrt |grep 'Jun 30th' | awk '{print $9}' | xargs mv -t /destinationFolder
Run Code Online (Sandbox Code Playgroud)
我正在尝试从特定日期或模式或创建用户移动文件。如果没有该选项,它就无法正常工作-t。
有人可以解释一下xargs -n移动-t命令吗?
在 bash 行编辑中(或在任何使用 GNU readline 的程序中),Meta-f 向右移动一个“单词”,Meta-b 向左移动一个“单词”,其中“单词”由字母组成和数字。这些是forward-word和backward-word命令。(Meta-f 可以是 Alt 修饰键或前缀 Escape 键。)
例如,如果我输入了
cat /etc/motd
Run Code Online (Sandbox Code Playgroud)
然后重复键入 Meta-b 将光标移动到m,然后是e,然后是c。
是否有类似移动的命令,但由空格分隔的单词,/etc/motd单个单词也是如此?
(我经常使用很长的文件路径,我希望能够轻松跳过它们。我的解决方法是重复键入现有的 word-move 命令,或者键入 ^X ^E 以启动编辑器。 )
在VIM,w并b向前和向后移动的话,W并B用空格分隔的单词移动。我正在寻找类似的东西。
我查看了readline文档,我怀疑答案是否定的,但也许我错过了一些东西。
shebang 标头必须始终与解释器的安装目录匹配吗?如果是这样,那么为什么既#!/usr/bin/python和#!/usr/local/bin/python我的工作?