标签: bash

如何使用笑脸自定义终端 bash 提示?

我想弄清楚如何自定义终端的 bash 提示以使用笑脸。我想要的(如示例中所见)是通过 \n 将 cwd 与提示分开,如果命令成功则显示绿色笑脸,如果失败则显示红色悲伤脸。

有任何想法吗?

这是受到 Peepcode 截屏视频的启发。

例子

bash command-line terminal.app macos

11
推荐指数
2
解决办法
7279
查看次数

如何将文件复制到 Windows 共享?

如何使用 bash 将文件复制到 Windows 共享?

samba bash

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

获取 bash 提示的当前窗口号

我想用显示窗口编号的 bash 提示替换状态栏,例如?。如何在 shell 中获取当前窗口号?

有 TMUX_PANE 环境变量,不幸的是没有 TMUX_WINDOW。

我得到的最接近的是: tmux display-message闪烁窗口/窗格信息,然后取最后一行tmux show-messages并解析它。我不希望每次显示提示时窗口/窗格信息都闪烁。

bash prompt tmux

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

~ 在 Linux shell 中是什么意思?

我是 Linux 新手,经常看到这种情况。有人可以在这里解释这个概念吗?

~/.somefilename
Run Code Online (Sandbox Code Playgroud)

~(波浪号)是什么意思?

linux unix bash shell csh

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

Bash:活动 IP 地址的反向 DNS 查找

我有一个单行命令,可以从 Web 服务器访问日志中列出前 10 个最活跃的 IP 地址:

cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | tail -n10
Run Code Online (Sandbox Code Playgroud)

示例结果集(为简单起见只有 3 个条目)将是:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255
Run Code Online (Sandbox Code Playgroud)

如您所见,计数在 IP 地址之前,两者由空格分隔。计数前实际上也有空格,但我无法在此处显示它们。

我喜欢对 IP 地址进行反向 DNS 查找,使其看起来像这样:

20 12.34.56.7 (d12-34-56-7.abhsia.telus.net)
22 3.67.89.201 (customer.vpls.net)
29 9.0.203.255 (9-0-203-255.hlrn.qwest.net)
Run Code Online (Sandbox Code Playgroud)

如何在不求助于脚本的情况下执行此操作(即坚持使用单行命令)?非常感谢任何建议。

networking linux dns bash

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

如何从终端删除所有隐藏的 .swp 文件

如何删除所有 .swp 文件?我试过了,rm *.swp但我得到了rm: *.swp: No such file or directory

rwxr-xr-x  16 teacher  staff    544 Jan 17 13:19 .
drwxr-xr-x  19 teacher  staff    646 Jan 16 12:48 ..
-rw-r--r--   1 teacher  staff  20480 Jan 17 09:48 .6-1-period-2.txt.swp
-rw-r--r--   1 teacher  staff  16384 Jan 17 09:05 .6-2-period-6.txt.swp
-rw-r--r--@  1 teacher  staff   6148 Jan 15 16:16 .DS_Store
-rw-r--r--   1 teacher  staff  12288 Jan 16 19:46 .grade8.txt.swp
-rw-r--r--   1 teacher  staff  11070 Jan 17 09:48 6-1-period-2.txt
Run Code Online (Sandbox Code Playgroud)

terminal bash shell command-line globbing

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

带有 glob 的 ls 在 bash 脚本中不起作用

我需要列出目录的所有子目录,不包括那些与作为参数给出的任何列表匹配的子目录:“SUBDIR1,SUBDIR2,...,SUBDIRN”。

我带来了使用 ls 和 glob 模式的解决方案(来自许多来源)。为了测试这个概念,我在命令行中尝试了以下似乎有效的序列:

DIR="/path/to/dirs"
EXCLUDELIST="subdir1,subdir2"
#transform in a glob pattern for excluding given subdirectories
EXCLUDE="!(${EXCLUDELIST//,/|})"
LIST=$(cd $DIR && ls -l -d $EXCLUDE | grep -E "(^d)" | awk '{print $9}')
Run Code Online (Sandbox Code Playgroud)

但是,当我将它放入未修改的 bash 脚本中时,我收到此错误

ls: cannot access !(subdir1|subdir2): No such file or directory
Run Code Online (Sandbox Code Playgroud)

将此代码放入脚本时我做错了什么?

bash command-line

11
推荐指数
2
解决办法
9401
查看次数

使用管道运算符在 bash 中解析 json

我正在使用AWS CLI 客户端获取快照的状态,但输出为 JSON 格式。例如。

{
    "DBClusterSnapshots": [
        {
            "AvailabilityZones": [
                "us-east-2a",
                "us-east-2b",
                "us-east-2c"
            ],
            "DBClusterSnapshotIdentifier": "...",
            "DBClusterIdentifier": "...",
            "SnapshotCreateTime": "2021-12-23T05:59:41.658000+00:00",
            "Engine": "aurora",
            "AllocatedStorage": 517,
            "Status": "copying",
            "Port": 0,
            "ClusterCreateTime": "2020-01-17T18:59:19.045000+00:00",
            "MasterUsername": "...",
            "EngineVersion": "5.6.mysql_aurora.1.22.1",
            "LicenseModel": "aurora",
            "SnapshotType": "manual",
            "PercentProgress": 0,
            "StorageEncrypted": true,
            "KmsKeyId": "...",
            "DBClusterSnapshotArn": "...",
            "SourceDBClusterSnapshotArn": "...",
            "IAMDatabaseAuthenticationEnabled": false,
            "TagList": []
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

grep我可以使用和sed( )的组合| grep Status | sed 's/.*"Status": "//' | sed 's/",//'来隔离“复制”的状态,但我想知道是否有更简单的方法来解析 bash 中的 JSON。例如。var['DBClusterSnapshots'][0]['Status']

linux bash json amazon-web-services ubuntu-20.04

11
推荐指数
2
解决办法
2294
查看次数

如何通过 shell 脚本检查环境是否为 WSL?

在 中.bashrc,我有一些针对像这样的特定环境的配置。

if [ "$(uname)" = 'Linux' ]; then
   . "$HOME/.bash.d/ubuntu"
fi

if [ "$(uname)" = 'Darwin' ]; then
   . "$HOME/.bash.d/osx"
fi
Run Code Online (Sandbox Code Playgroud)

为了了解当前环境是否在WSL下,我使用/etc/wsl.conf通常只存在于 WSL 中的文件。

if [ -f "/etc/wsl.conf" ]; then
   . "$HOME/.bash.d/wsl"
fi
Run Code Online (Sandbox Code Playgroud)

当然,该文件也可以存在于其他环境中。

我应该如何检查当前环境是否在 WSL 中运行?

bash ubuntu windows-subsystem-for-linux

11
推荐指数
2
解决办法
5841
查看次数

在bash中,如何查找特定目录中给定文件的所有副本?

假设我们有一个/a_long_path_1/foo.doc大小为 12345 字节的文件,我们希望在目录中找到该文件的所有副本/a_long_path_2,并/a_long_path_3递归地包括其所有子目录。副本名称的主要部分可能有所不同foo(尽管扩展名.doc可能保持不变),并且创建/修改日期可能不同,但foo其副本的内容应该相同。

\n

如果我发出find /a_long_path_2 /a_long_path_3 -size 12345c -iname \\*.doc,我得到的列表太大,无法通过手动检查diff。需要自动化。可能使自动化变得困难的附加信息:此命令输出中的某些目录名称find \xe2\x80\xa6包含空格。

\n

需要明确的是:我不希望找到文件系统上所有文件的所有重复项(而是仅找到一个特定文件的所有重复项),甚至不希望作为中间步骤。(无论如何,这样的列表会很大。)

\n

linux debian bash deduplication find

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