标签: bash

Bash 提示“变量”不起作用?

我已将此添加到我的 ~/.bashrc 中,以更改提示:

PS1='[\u@\h \w]\$ '

但是,它没有显示我想要的。我相信这是为了显示我的用户名,可能还有我所在的目录,但它只是显示[\u@\h \w]\$在终端中。

即使在只是PS1='\u'仍然显示\u在终端中。

terminal bash prompt gnome-terminal

5
推荐指数
1
解决办法
2432
查看次数

如何使 bash 的 glob 字符类区分大小写?

我创建了一些文件,比如knob_A.pngknob_a.png,我在 Windows 上的队友说这会导致她的应用程序出现问题。我决定调用它knob_W.png而不是knob_a.png. 然后我对我们的共享服务器做了一个 rsync。为了清理东西,我然后做了

rm knob_[a-d]*.png
Run Code Online (Sandbox Code Playgroud)

它也删除knob_A.png了。这是错误的足球棒。

shopt -s nocaseglob不会也不会shopt -u nocaseglob导致它按照我想要的方式行事。

我如何告诉 bash 让它的 glob 像过去一样区分大小写?

bash globbing

5
推荐指数
1
解决办法
842
查看次数

如何仅在通过 ssh 登录时加载部分 bash 别名

正如标题所述,是否可以仅在我通过 访问机器时加载别名ssh,或者更好的是,仅从特定计算机通过 访问ssh

linux ssh bash .bash-profile tmux

5
推荐指数
1
解决办法
211
查看次数

对特定行使用 sed 命令

当我想要的状态存在时,我想更改文件中的单元格。例子:

文件:

id311    vmName1    state0
id312    vmName2    state0
id313    vmName3    state0
Run Code Online (Sandbox Code Playgroud)

我将键入一个脚本,该脚本仅更改一行的状态列。所以如果我输入sed -i 's/state0/state1/g'all state0's be state1。我只想更改一行的状态,例如:

文件:

id311    vmName1    state0
id312    vmName2    state1
id313    vmName3    state0 
Run Code Online (Sandbox Code Playgroud)

如何将sed命令用于带有 use id 的特殊行?注意:id 是唯一的。

linux script bash sed

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

将文件从子目录移动到单个目录并为原始目录名称添加前缀

我有一个这样的目录结构:

./a/1.png
./a/2.png
./a/3.png
./b/1.png
./b/2.png
./b/3.png
./c/1.png
...
Run Code Online (Sandbox Code Playgroud)

我想获取子目录中的所有文件并将它们移动到一个新目录中,这样它们的名称就类似于

../dest/a_1.png
../dest/a_2.png
../dest/a_3.png
../dest/b_1.png
../dest/b_2.png
../dest/b_3.png
../dest/c_1.png
...
Run Code Online (Sandbox Code Playgroud)

我能够找到的最接近的方法是在不编写脚本来逐个文件地执行此操作的情况下使用find--backup=numbered选项,该选项会将我的文件压缩到单个目录,但最终会丢失文件名中的目录上下文。

有没有简洁的方法来实现这一目标?

linux bash mv ubuntu

5
推荐指数
2
解决办法
2273
查看次数

使用别名在 bash 中回显反引号

抱歉,如果在其他地方回答了这个问题,我一生都无法找到解决我的特殊情况的方法,我承认这有点奇怪。(注意:由于某种原因,这篇文章中的所有“使用”字样都显示为蓝色,但它们不应该是蓝色的,我不知道如何防止它)。

我在 MacOS 中使用 bash。我的 .bashrc 中有一些别名,它们只是向终端窗口打印一些东西来帮助我记住命令,或者快速向某人展示一个示例(在下面的代码中,我在命令行上创建别名,但实际上我总是将别名放在 .bashrc 中):

556 ~ alias howtotensorboard="echo tensorboard --logdir=logs/ --port=6001"
557 ~ howtotensorboard
tensorboard --logdir=logs/ --port=6001
Run Code Online (Sandbox Code Playgroud)

如果我只在命令行上使用 echo,在反引号前面加上反斜杠允许我将反引号打印到窗口:

559 ~ echo Using \`which python\` etc
Using `which python` etc
Run Code Online (Sandbox Code Playgroud)

但是在别名中做同样的事情实际上是执行 `which python` 而不是将它打印到窗口:

560 ~ alias howtobacktick="echo Using \`which python\` etc"
561 ~ howtobacktick
Using /usr/bin/python etc
Run Code Online (Sandbox Code Playgroud)

TL; DR,我想要的是在 .bashrc 中放置一个别名,该别名使用 echo 打印出一个反引号,以便最后我可以在 bash 中做到这一点:

558 ~ howtobacktick
Using `which python` etc
Run Code Online (Sandbox Code Playgroud)

我在 .bashrc 中的别名中尝试了许多变体,但没有一个起作用。我怎样才能得到我正在寻找的行为?而且,有没有办法专门用回声来做到这一点?

terminal bash command-line bash-alias

5
推荐指数
1
解决办法
2890
查看次数

我应该在脚本中使用 sudo 还是在整个脚本中使用 sudo?

我为学生运行了一小组 macOS 机器(比如 20 台),它们都需要使用自制软件和其他软件包和应用程序等进行设置。我正在编写一个 bash 脚本来自动安装每台计算机上所需的所有东西。我将使用的一些命令需要以 root 身份运行,但不是大多数。

我想知道在脚本中单独 sudo 这些命令中的每一个是否会更好,或者将 sudo 排除在脚本之外并 sudo 整个脚本。我想知道哪一个更安全(安全方面),更适合我的情况。我不想在整个脚本中都被提示输入密码,但我也不想以 root 身份运行脚本中的每一行,因为它不安全。

root sudo bash

5
推荐指数
2
解决办法
3702
查看次数

Bash 管道信号传播 - 它是如何工作的?

在回答这个问题时,我无法完全解释信号如何通过管道传播。

考虑以下示例。

使用timeout作为管道的第一个元素

这会导致gpg救助已捕获的SIGTERM交付给cat,由timeout,留下损坏的文件。

$ timeout 1 cat /dev/urandom | gpg -er attie@attie.co.uk > ./myfile.gpg

gpg: Terminated caught ... exiting
Terminated
$ gpg -d < ./myfile.gpg > /dev/null

You need a passphrase to unlock the secret key for
user: "Attie Grande <attie@attie.co.uk>"
4096-bit RSA key, ID C9AEA6AE, created 2016-12-13 (main key ID 7826F053)

gpg: encrypted with 4096-bit RSA key, ID C9AEA6AE, created 2016-12-13
      "Attie Grande <attie@attie.co.uk>"
gpg: block_filter …
Run Code Online (Sandbox Code Playgroud)

bash

5
推荐指数
1
解决办法
1183
查看次数

在 Linux 的 Windows 子系统中修复 .bashrc 中的“输入/输出错误”

我错误地.bashrc使用 Windows 文本编辑器 (Notepad++) 为我的 WSL(Linux 的 Windows 子系统)Bash编辑了文件。

现在,每当我运行 Bash 时,都会出现以下错误:

bash: /root/.bashrc: 输入/输出错误

我怎样才能解决这个问题?我尝试使用 Linux 文件结尾(仅 LF)进行保存,但这没有用。

windows bash windows-subsystem-for-linux

5
推荐指数
1
解决办法
8526
查看次数

自定义命令的 Bash 自动完成子目录

我已经尝试了几个小时来使这个工作正常进行,但我觉得我还没有接近任何地方。

我试图通过从 Mac OS X 终端完成目录名称的制表符来缩短我们的工作流程。

我们有一个内部工具,我们称之为 ,它bob会自动在 git 子模块上运行命令。我想做的是让它自动完成子目录名称。问题是,这些子目录位于静态位置。

   project directory
   ->public
     ->submodules
       ->a-module
       ->another-module
       ->other-module
       ->some-module
Run Code Online (Sandbox Code Playgroud)

命令从顶级项目目录运行,如下所示:

bob start bugfix anothermodule
Run Code Online (Sandbox Code Playgroud)

而不是必须完全输入“anothermodule”,这是我们目前所做的,我希望让标签自动完成工作。我们每天多次使用此工作流程,将其缩短几秒钟会很棒并且可以避免打字错误。

最终目标是:

bob start bugfix an<tab>
Run Code Online (Sandbox Code Playgroud)

会自动完成

bob start bugfix anothermodule
Run Code Online (Sandbox Code Playgroud)

我试过CDPATH但很快意识到这不是我想要的,因为这不是遵循cd命令,只是我的自定义命令。

我已经bash_completion安装,但一般来说我不太擅长 bash。提到这一点,以防万一它可以成为解决方案的一部分!

bash command-line autocomplete tab-completion macos

5
推荐指数
1
解决办法
1412
查看次数