我有一个程序安装在 /opt 下的自定义目录中。为了更容易运行它,我编辑了我的 bashrc 以将所述目录添加到我的路径中:
export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin
Run Code Online (Sandbox Code Playgroud)
如果我想在没有 sudo 的情况下运行程序,这很好用。但是,如果我尝试使用 sudo 运行它,它会因“找不到命令”错误而失败。
$ sudo godi_console
sudo: godi_console: command not found
Run Code Online (Sandbox Code Playgroud)
使用 sudo 后检查 PATH 变量表明它不包括我作为普通用户所拥有的相同 PATH:
$ sudo sh
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
为什么 PATH 不一样?难道我做错了什么?我在 Debian Jessie 上,如果它有所作为。
我尝试的一件事是直接调用 /opt/godi/sbin/godi_console,将绝对路径传递给可执行文件。不幸的是,这在这种特殊情况下没有帮助,因为 godi_console 本身取决于正确设置的 PATH。
我的 .bashrc 有一些重复的代码,所以我使用了一个函数来简化它
do_stuff() {
local version=$1
export FOO_${version}_X="17"
export FOO_${version}_Y="42"
}
do_stuff '5.1'
do_stuff '5.2'
Run Code Online (Sandbox Code Playgroud)
但是,现在当我使用我的 shell 时,“do_stuff”名称在范围内,因此我可以选项卡完成并运行该函数(可能会弄乱我的环境变量)。有没有办法让“do_stuff”只在 .bashrc 中可见?
通常,当我的程序进行全盘扫描并检查系统中的所有文件时,它们需要很长时间才能运行。相比之下,为什么updatedb 运行得如此之快?
我想在退出 GNOME 会话之前运行一个脚本,以警告自己是否忘记了插入机器的 Pendrive。
但是,我发现的所有解决方案对我来说都不够:
根据其文档,bash 会等到管道中的所有命令都完成运行后再继续
shell 在返回值之前等待管道中的所有命令终止。
那么为什么命令会yes | true立即完成呢?不应该yes永远循环并导致管道永远不会返回吗?
还有一个子问题:根据POSIX 规范,shell 管道可以选择在最后一个命令完成后返回或等待所有命令完成。在这个意义上,普通壳有不同的行为吗?是否有任何贝壳yes | true会永远循环?
我想编写一个 shell 脚本,用 BB 替换 A,用 AA 替换 B。例如,AYB变成BBYAA。对于这种事情,我通常的解决方案是将多个调用链接到 sed,如下所示:
sed 's/A/BB/g;s/B/AA/g'
Run Code Online (Sandbox Code Playgroud)
但是,这在这种情况下不起作用,因为A最终被翻译成AAAA而不是BB. tr似乎也不是一种选择,因为替换文本长于一个字符。还有什么我可以做的吗?如果它使用 sed 或 tr 以外的其他东西也没关系。
我正在为我正在打包的程序编写手册页。如何显示我创建的联机帮助页文件,以检查它是否正常?有没有办法将我的文件直接传递给man命令,而不是让它按名称搜索已安装的联机帮助页?
我尝试做类似的事情man myprog.1,man < myprog.1但在这两种情况下,我都收到一条错误消息,说找不到手册页。
我想计算特定字节序列在我拥有的文件中发生的次数。例如,我想找出该数字\0xdeadbeef在可执行文件中出现的次数。现在我正在使用 grep 这样做:
#/usr/bin/fish
grep -c \Xef\Xbe\Xad\Xde my_executable_file
Run Code Online (Sandbox Code Playgroud)
(字节以相反的顺序写入,因为我的 CPU 是小端的)
但是,我的方法有两个问题:
\Xnn转义序列仅适用于鱼壳。有没有办法解决这些问题?我怎样才能让这个 liner 在 Bash shell 中运行并准确计算该模式在文件中出现的次数?
我想重新映射我的 AltGR+Right_Windows,但我不知道如何。无论我尝试什么,无论是否按下右 alt,按右 Windows 键都会发出名称 keysym。
这些是我现在正在测试的 xmodmap 文件的内容。在我的键盘中,38 是“a”的键码,48 是单引号/双引号的键码,134 是右 Windows 键的键码。
keycode 38 = 1 2 3 4 5 6 7 8
keycode 48 = 1 2 3 4 5 6 7 8
keycode 134 = 1 2 3 4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)
当我按下 Right_Alt+撇号时,它输出 5,但 Right_Alt+a 和 Right_Alt+Right_Windows 给出 1(当按下右 alt 时和未按下时),这不是我想要的。
我当前的键盘布局是us(alt-intl),右侧的 alt 显然设置为充当 AltGr / Iso_Level3_Shift。的输出xmodmap -pm如下:
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L …Run Code Online (Sandbox Code Playgroud) 我想将Super+1和Super+Home作为快捷方式绑定到 GNOME 3 中的“切换到工作区 1”操作。有没有办法做到这一点?
我认为要实现这一点,要么必须有一种方法为同一操作分配多个键盘快捷键,要么必须有一种方法通过命令行操作切换工作区(这将让我为它创建一个快捷方式在“自定义快捷方式”部分)。但我不确定这些是可能的......