AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题

问题[pipe](ubuntu)

Martin Hope
lara
Asked: 2020-12-18 07:37:52 +0800 CST

find 命令无法找到管道文件

  • 1

我有一个名为dir.sock的文件。/var/spool/

这是结果ls -al /var/spool/

drwxr-xr-x.  9 root     root 121 Dec 16 09:55 .
drwxr-xr-x. 19 root     root 267 Dec 14 10:47 ..
drwxr-xr-x.  2 root     root  63 Oct 28  2019 anacron
drwx------.  2 root     root   6 Feb 13  2019 cron
drwxr-xr-x.  2 root     root   6 Dec 14  2017 lpd
drwxrwxr-x.  2 root     mail  22 Dec 14 10:47 mail
prw-r--r--.  1 telegraf root   0 Dec 17 10:04 nethermind.sock
drwxr-xr-x. 16 root     root 201 Jul 29  2019 postfix
drwxr-xr-x.  3 root     root  19 Oct 28  2019 rhsm
drwx------.  2 root     root   6 Sep  6  2018 up2date

可以看到nethermind.sock文件被标记为prw-r--r--.

我想删除这个文件,所以我在我的脚本中写了这个 -

NETHERMIND_SOCK="/var/spool/nethermind.sock"
PARITY_SOCK="/var/spool/parity.sock"

if [ -f $NETHERMIND_SOCK ]; then
    rm -f $NETHERMIND_SOCK
elif [ -f $PARITY_SOCK ]; then
    rm -f $PARITY_SOCK
else
    echo ".sock not found"
fi

它总是让.sock not found 我尝试查找和删除,例如-

sudo find / -type f -name "*.sock" -exec rm -f {} +

但似乎找不到该文件。

如果我这样做sudo find /var/spool/ -type f -name "nethermind.sock",它不会返回任何东西。

我不确定p这里的标记prw-r--r--.

这是一个链接,实际上是什么p标记的意思。但是find命令无法找到管道文件。

delete find pipe syslinux
  • 1 个回答
  • 86 Views
Martin Hope
Artur Meinild
Asked: 2020-09-28 12:16:39 +0800 CST

Shellcheck 对双引号变量的建议在管道切割时不起作用

  • 1

我正在制作一个脚本来打印 ZFS 文件系统信息 - 目前处于测试阶段,我遇到了一个奇怪的错误。

我的初始脚本的相关位是这样的:

zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo $zfs_human | cut -d ' ' -f2)"
zfs_totah="$(echo $dfs_human | cut -d ' ' -f2)"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"

给出以下输出:

zfs                      2.31M  5.27T     34.4K  /mnt/zfs
zfs                      5.3T  128K  5.3T   1% /mnt/zfs
2.31M
5.3T

但是,当我运行时shellcheck,它说我应该在命令替换中用双引号引起来,这是来自的输出shellcheck:

In zfsspace.sh line 5:zfs_usedh="$(echo $zfs_human | cut -d ' ' -f2)"                  ^--------^
SC2086: Double quote to prevent globbing and word splitting.

Did you mean: 
zfs_usedh="$(echo "$zfs_human" | cut -d ' ' -f2)"

In zfsspace.sh line 6:zfs_totah="$(echo $dfs_human | cut -d ' ' -f2)"                  ^--------^
SC2086: Double quote to prevent globbing and word splitting.

Did you mean: 
zfs_totah="$(echo "$dfs_human" | cut -d ' ' -f2)"

然后我当然将我的代码更改为 shellcheck 的建议:

zfs_human="$(zfs list | head -n 2 | tail -n 1)"
dfs_human="$(df -h | grep 'zfs' | head -n 1)"
zfs_usedh="$(echo "$zfs_human" | cut -d ' ' -f2)"
zfs_totah="$(echo "$dfs_human" | cut -d ' ' -f2)"
echo "$zfs_human"
echo "$dfs_human"
echo "$zfs_usedh"
echo "$zfs_totah"

但现在输出是这样的:

zfs                      2.31M  5.27T     34.4K  /mnt/zfs
zfs                      5.3T  128K  5.3T   1% /mnt/zfs
 
 

第 3 行和第 4 行是空白的,这意味着在遵循 shellcheck 的建议时,第 3 和第 4 个命令替换不起作用,但在不引用我回显的变量时起作用。

我在 Ubuntu 20.04.1 上使用 Bash 5.0.17

请问有人能解释一下吗???谢谢。

scripts bash pipe syntax
  • 2 个回答
  • 465 Views
Martin Hope
TADASUKE
Asked: 2020-08-10 21:59:10 +0800 CST

为什么命令替换有效且管道无效 [重复]

  • 2
这个问题在这里已经有了答案:
为什么命令“ls | file”不起作用? (8 个回答)
2年前关闭。

我正在练习|管道以传递输出。

首先,我尝试basename了

$ basename -a $(ls test_directory/*) 

此行按预期工作,仅显示文件名而不显示目录名。

但是当我尝试通过管道输出lstobasename

$ ls test_directory/* | basename -a

错误信息在这里:

basename: missing operand
Try 'basename --help' for more information.

我发现将上一个命令的输出传递给下一个作为Unix 和 Linux上的参数,其中一个答案提到:

  1. 通过标准输入传递输入:

    ls | wc -l 
    

    这将计算 ls 输出中的行数

  2. 通过命令行参数传递输入:

    wc -l $(ls)
    

    这将计算 ls 打印的文件列表中的行数

我无法理解“输出ls”和“由”打印的文件之间的区别ls。他们不是一样的吗?我想了解其中的区别。

我想了解为什么ls td/* | basename -a 不起作用。

command-line bash pipe
  • 2 个回答
  • 963 Views
Martin Hope
Zorglub29
Asked: 2020-06-30 23:19:32 +0800 CST

Bash 函数可将终端输出稳健地通过管道传输到 vim

  • 7

我经常以这种方式将我的终端输出重定向到 vim,我厌倦了一直打字:

ls | vim -

我想定义一个函数v来为我做这件事,即我希望能够输入:

v ls并且这以某种方式“扩展”到上一个命令。

我可以使用这种脚本在简单的情况下执行此操作(当然,这可以重构为一个小函数):

#!/bin/bash 
 
touch crrt_cmd

while (( "$#" )); do 
  echo -n $1 >> crrt_cmd
  echo -n " " >> crrt_cmd
  shift 
done

chmod +x crrt_cmd
bash crrt_cmd | vim -

rm crrt_cmd

这适用于非常简单的命令,例如lsor ls -l,但是当某些管道存在时,它根本不起作用。

关于如何执行类似操作的任何想法,但适用于任何有效的 bash 命令?


所以为了清楚起见,如果可能的话,我希望事情以这种方式工作:

v ls | grep keyword | head -5

将转化为:

ls | grep keyword | head -5 | vim -
vim command-line bash pipe
  • 2 个回答
  • 1527 Views
Martin Hope
bela53
Asked: 2020-06-23 13:44:23 +0800 CST

将密码参数传递给 mount shell 命令

  • 1

现状

给出以下/etc/fstab挂载点:

//server/app /home/user/server/app cifs noauto,user,vers=3.11  0 0
//server/code /home/user/server/code cifs noauto,user,vers=3.11  0 0

这些要以user特权(不带sudo)安装。Givenuser已登录,password当前以交互方式提示 - 没有凭据文件,也没有硬编码的密码/etc/fstab。

另外:所有共享都具有相同的凭据user和相同的密码。

问题是什么?

假设我们想在启动时挂载所有共享。分享app:

mount ~/server/app # `user` is active
# password interactively requested
Password for user@//server/app:  (press TAB for no echo)

问题是,我必须为所有共享输入相同的密码,因为它不会被缓存。

我试过的

# type password once and store it in process memory
echo "Enter password for mounts:"
read -s mount_pass
[[ -z "mount_pass" ]] && echo "Password empty, exiting" && exit

# mount all shares - how to feed every mount command with given password?
mount ~/server/app
mount ~/server/code

# My attempts
echo $mount_pass | mount ~/server/app
mount ~/server/app < <(echo $mount_pass)

(原谅我肤浅的shell知识)

有没有办法将存储在命令中的密码传递$mount_pass给mount命令,以便它可以通过其标准输入自动读取并且不打开交互式提示?

fstab mount password pipe stdout
  • 1 个回答
  • 737 Views
Martin Hope
Alireza
Asked: 2020-04-19 20:35:43 +0800 CST

以交互方式使用 systemd-escape

  • 0

如果我们使用systemd-escape SomePassword,密码将存储在 bash_history 文件中。是否可以以交互方式使用它?

cat | systemd-escape正如预期的那样失败,systemd-escape输入数据作为参数而不是标准输入。

bash pipe
  • 1 个回答
  • 152 Views
Martin Hope
virusivv
Asked: 2020-02-21 10:01:02 +0800 CST

终端上带有管道字符的自定义命令

  • 0

我需要在 Ubuntu 上制作一些自定义命令,一切正常,直到我发现我的新自定义命令需要 | 作为输入参数。所以,当我创建我的函数时,它没有将管道之后的部分识别为命令并且抛出命令未找到错误。IE

function listhorizontal(){
echo "1st line"
echo "hello $1"
echo "3rd line"
}

#output
ubuntu:~$ listhorizontal JohnDoe
1st line
hello JohnDoe
3rd line

它正在工作,但是当我尝试使用具有 | 的命令时 喜欢:

function getwithpipe(){
if [[ $1 =~ "|" ]]
then
   echo "It's there!"
fi

}
#output
ubuntu:~$ getwithpipe stringcontains|fortest
fortest: command not found

那么它就行不通了。

是否有可能更改管道的映射?

command-line bash pipe
  • 1 个回答
  • 281 Views
Martin Hope
Slaus
Asked: 2020-02-17 18:03:19 +0800 CST

在我的程序中使用 popen() 后,终端窗口不显示我的输入

  • 1

在我的C++程序中,我使用ffmpegpopen()读取视频帧。当程序自行停止或者我用我在终端中输入的所有内容关闭它时,它永远不会出现(但它就在那里)。我用 . 关闭管道。当我尝试再次构建我的程序并且它失败时会打印错误 - 它会自行修复。Ubuntu 18.04.3,内核 5.4Ctrl+Cpclose()gcc

是终端窗口的错误还是我以某种方式误解了管道?

command-line gnome-terminal pipe
  • 1 个回答
  • 602 Views
Martin Hope
Victor
Asked: 2019-07-31 07:20:01 +0800 CST

SIGQUIT 打破管道

  • 1

Linux ping 实用程序可以在SIGQUIT不终止的情况下生成一些关于接收的统计信息。它看起来像这样:

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=37.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=36.3 ms
2/2 packets, 0% loss, min/avg/ewma/max = 36.399/37.126/37.672/37.854 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=45 time=36.2 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 36.294/36.849/37.854/0.711 ms

如您所见,我SIGQUIT在第二次请求后立即按Ctrl+发送\并立即获得统计信息。

但是当我尝试对管道使用 ping 时,情况就不同了。命令:

ping -O 8.8.8.8 | while read pong; do echo "$(date): $pong"; done

这次发送SIGQUIT(Ctrl+ \)打破了管道:

Tue Jul 30 18:15:20 EEST 2019: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
Tue Jul 30 18:15:20 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=71.1 ms
Tue Jul 30 18:15:21 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=51.4 ms
Tue Jul 30 18:15:22 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=3 ttl=45 time=54.5 ms
Tue Jul 30 18:15:23 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=4 ttl=45 time=56.5 ms
Tue Jul 30 18:15:24 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=5 ttl=45 time=56.5 ms
Tue Jul 30 18:15:25 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=6 ttl=45 time=60.1 ms
6/6 packets, 0% loss, min/avg/ewma/max = 51.421/58.394/63.927/71.104 ms
Quit (core dumped)

有人可以告诉这种行为的原因是什么吗?

networking command-line pipe signal
  • 1 个回答
  • 185 Views
Martin Hope
aldr
Asked: 2019-07-31 01:22:43 +0800 CST

如何将 find 的输出视为字符串而不是对文件或目录的引用

  • 0

当我跑步时

find  ~/foo/bar/. -mindepth 1 -maxdepth 1 -type d

我得到给定路径的所有子目录的输出。例如

/home/user/foo/bar/a
/home/user/foo/bar/b
...
/home/user/foo/bar/abcd

现在我想将该输出用作字符串,所以我添加-print以替换一些找到的结果

find  ~/foo/bar/. -mindepth 1 -maxdepth 1 -type d -print | xargs sed 's#/home/user/foo/bar/#some_text"#g'

但结果并不如预期

sed:在 /home/user/foo/bar/./abc 上读取错误:是一个目录

显然 sed 不会将管道参数视为我想要的字符串,例如

some_text/a
some_text/b
...
some_text/abcd
bash sed find pipe
  • 3 个回答
  • 282 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve