小编hug*_*omg的帖子

如何让`sudo` 保留$PATH?

我有一个程序安装在 /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。

sudo path

164
推荐指数
5
解决办法
13万
查看次数

如何在我的 bashrc 中创建本地函数?

我的 .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 中可见?

bash bashrc

42
推荐指数
3
解决办法
2万
查看次数

为什么`updatedb` 程序运行得这么快?

通常,当我的程序进行全盘扫描并检查系统中的所有文件时,它们需要很长时间才能运行。相比之下,为什么updatedb 运行得如此之快?

performance updatedb

25
推荐指数
2
解决办法
3114
查看次数

如果我没有管理员权限,如何在 GNOME 注销期间运行脚本?

我想在退出 GNOME 会话之前运行一个脚本,以警告自己是否忘记了插入机器的 Pendrive。

但是,我发现的所有解决方案对我来说都不够:

  • 这个类似的问题建议编辑/etc/gdm/PostSession/Default文件,但我没有这样做的权限。(并且文件目前在我的机器上是空的,所以没有现有的钩子可以利用)

  • 我还发现这篇文章提出了一种解决方法,但根据第一个回复,如果我关闭计算机而不是仅注销,它就不起作用。

gnome logout

19
推荐指数
2
解决办法
5584
查看次数

为什么在 bash 管道上使用“是”*不会*导致无限循环?

根据其文档,bash 会等到管道中的所有命令都完成运行后再继续

shell 在返回值之前等待管道中的所有命令终止。

那么为什么命令会yes | true立即完成呢?不应该yes永远循环并导致管道永远不会返回吗?


还有一个子问题:根据POSIX 规范,shell 管道可以选择在最后一个命令完成后返回或等待所有命令完成。在这个意义上,普通壳有不同的行为吗?是否有任何贝壳yes | true会永远循环?

shell bash pipe

19
推荐指数
2
解决办法
2993
查看次数

有没有办法用 sed 进行多次替换,而不用链接替换?

我想编写一个 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 以外的其他东西也没关系。

sed text-processing

19
推荐指数
6
解决办法
1526
查看次数

如何直接显示手册页?

我正在为我正在打包的程序编写手册页。如何显示我创建的联机帮助页文件,以检查它是否正常?有没有办法将我的文件直接传递给man命令,而不是让它按名称搜索已安装的联机帮助页?

我尝试做类似的事情man myprog.1,man < myprog.1但在这两种情况下,我都收到一条错误消息,说找不到手册页。

man

18
推荐指数
3
解决办法
4203
查看次数

如何计算文件中字节序列出现的次数?

我想计算特定字节序列在我拥有的文件中发生的次数。例如,我想找出该数字\0xdeadbeef在可执行文件中出现的次数。现在我正在使用 grep 这样做:

#/usr/bin/fish
grep -c \Xef\Xbe\Xad\Xde my_executable_file
Run Code Online (Sandbox Code Playgroud)

(字节以相反的顺序写入,因为我的 CPU 是小端的)

但是,我的方法有两个问题:

  • 这些\Xnn转义序列仅适用于鱼壳。
  • grep 实际上是在计算包含我的幻数的行数。如果该模式在同一行中出现两次,则只会计数一次。

有没有办法解决这些问题?我怎样才能让这个 liner 在 Bash shell 中运行并准确计算该模式在文件中出现的次数?

grep bash escape-characters

17
推荐指数
5
解决办法
3798
查看次数

为什么我的 xmodmap 绑定涉及 AltGr 仅适用于某些键?

我想重新映射我的 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)

xmodmap

12
推荐指数
2
解决办法
7704
查看次数

如何在 GNOME 3 中为切换工作区分配冗余快捷方式?

我想将Super+1和Super+Home作为快捷方式绑定到 GNOME 3 中的“切换到工作区 1”操作。有没有办法做到这一点?

我认为要实现这一点,要么必须有一种方法为同一操作分配多个键盘快捷键,要么必须有一种方法通过命令行操作切换工作区(这将让我为它创建一个快捷方式在“自定义快捷方式”部分)。但我不确定这些是可能的......

keyboard-shortcuts gnome3

11
推荐指数
1
解决办法
2880
查看次数