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
    • 最新
    • 标签
主页 / user-214773

StoneThrow's questions

Martin Hope
StoneThrow
Asked: 2024-01-05 09:16:51 +0800 CST

是否可以在不编辑sources.list的情况下查询非我当前版本的APT软件包版本?

  • 6

我最近一直在学习Linux包管理(https://superuser.com/questions/393681/how-to-find-out-which-versions-of-a-package-can-i-install-on-apt,https://askubuntu.com/questions/340530/how-can-i-check-the-available-version-of-a-package-in-the-repositories,为什么不同的 Linux 发行版有不同的包格式(以及包管理器)?,https://itsfoss.com/ubuntu-repository-mechanism/,https : //itsfoss.com/sources-list-ubuntu/)

如果我理解正确的话,/etc/apt/sources.list(和.list/.sources文件/etc/apt/sources.list.d/)控制apt-get从哪里(和相关实用程序)获取包/源代码。

由于我当前的版本是 jammy,因此我的条目sources.list如下:

deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted

...我认为这意味着(之后running apt-file update)将在http://archive.ubuntu.com/ubuntu/dists/jammy/main/apt-cache policy libuv1上查找所有可用版本libuv1

$ apt-cache policy libuv1
libuv1:
  Installed: 1.43.0-1
  Candidate: 1.43.0-1
  Version table:
 *** 1.43.0-1 500
        500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status
$
$ apt-cache madison libuv1
    libuv1 |   1.43.0-1 | http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    libuv1 |   1.43.0-1 | http://archive.ubuntu.com/ubuntu jammy/main Sources
$

我的问题是:有没有办法在libuv1不进行编辑的情况下查询除 jammy 以外的版本的包的可用版本sources.list?

从上面的apt-cache输出来看,1.43.0-1 似乎是唯一可用的版本 - 无论是作为包还是作为源。但我知道libuv 作者有更新的版本。我想了解是否可以查询非 Jammy 软件包存储库以获取较新的libuv1软件包或源代码的可用性。出于过度的谨慎,我对添加诸如deb-src http://archive.ubuntu.com/ubuntu/ mantic main restrictedto 之类的条目感到紧张sources.list,因为我担心我可能会忘记,然后不小心运行apt-get upgrade- 那不是会冒创建FrankenDebian的风险吗?

我只想知道 - 如果只是出于好奇 - 较新版本的源代码/包是否libuv1存在于我当前版本之外的版本中,而没有编辑带来的风险sources.list- 有没有办法?换句话说:是否需要sources.list同时进行编辑以查询可用性和安装软件包,或者是否可以在不编辑文件的情况下查询软件包可用性?

apt
  • 2 个回答
  • 35 Views
Martin Hope
StoneThrow
Asked: 2024-01-05 07:45:45 +0800 CST

/etc/apt/sources.list 中的第 3 列(suite/release/distribution)是什么?

  • 5

我很困惑 Ubuntu 的/etc/apt/sources.list.

来自man sources.list(为了相关性而编辑):

使用 deb 和 deb-src 类型的两个单行样式条目的格式为:

deb [ 选项1=值1 选项2=值2 ] uri 套件[组件1] [组件2] [...]
deb-src [ 选项1=值1 选项2=值2 ] uri 套件[组件1] [组件2] [...]

suite 可以指定精确路径,在这种情况下,必须省略组件,并且 suite 必须以斜杠结尾...如果 suite 未指定精确路径,则必须至少存在一个组件。

suite 还可能包含一个变量 $(ARCH),它扩展到系统上使用的 Debian 架构(例如 amd64 或 armel)。

来自https://wiki.debian.org/SourcesList(其中第 3 列似乎被称为“发行版”):

“发行版”可以分别是发行代号/别名(stretch、buster、bullseye、bookworm、sid)或发行类(oldoldstable、oldstable、stable、testing、unstable)。如果您打算跟踪发布类,请使用类名称。

来自https://help.ubuntu.com/community/Repositories/CommandLine(针对相关性进行了编辑):

通常.../etc/apt/sources.list 看起来像这样:

deb http://ch.archive.ubuntu.com/ubuntu/ saucy main restricted
deb-src http://ch.archive.ubuntu.com/ubuntu/ saucy main restricted

...
saucy 是您的发行版的发行名称或版本。
...
对于其他 Ubuntu 版本,您可以将 'saucy' 替换为您已安装的当前版本('precise'、'quantal'、'raring'、'saucy'、'trusty'、...) 输入 lsb_release -sc找出你的版本。

根据lsb_release -sc,我的套件/发行版/发行版是“jammy”:

$ lsb_release -sc
jammy
$

我的问题是:鉴于我的套件/发布/发行版是“jammy”,这显然是应该在第 3 列中使用的值,为什么/etc/apt.sources.list文件中的某些条目的第 3 列值为jammy-security,jammy-updates和jammy-backports?

$ cat /etc/apt/sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu/ jammy universe
# deb-src http://archive.ubuntu.com/ubuntu/ jammy universe
deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://archive.ubuntu.com/ubuntu/ jammy multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy multiverse
deb http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted
deb http://security.ubuntu.com/ubuntu/ jammy-security universe
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security universe
deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security multiverse

my 中的第 3 列值sources.list似乎不是精确路径,也没有变量,并且似乎不是发行版类,因此我认为man sources.listDebian wiki 中的相应部分不适用。但我没有看到任何关于套件/发布/发行版“后缀”的描述(因为我不知道正确的称呼),例如“-updates”、“-security”或“-backports”。


如果相关:请解释术语“套件”、“分发”和“发布”在这种情况下是否可以互换使用,或者它们之间是否存在有意义的差异。从这个问题的答案中,我认为我已经理解了“发行版”意味着 Ubuntu vs. Debian vs. Fedora 等,因此它在这种情况下的使用(特别是 Debian wiki)掩盖了我的理解我已经到达了。

ubuntu
  • 1 个回答
  • 28 Views
Martin Hope
StoneThrow
Asked: 2023-12-12 05:12:41 +0800 CST

如何安装 apt-get 不可用的软件包版本?

  • 5

我想在 Ubuntu WSL 实例上安装 libuv,并且特别需要版本 1.45.0 或更高版本。

我的理解(来自本教程文章)是,查找可安装的软件包版本的命令是apt list | grep:

$ apt list | grep libuv

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libuv1-dev/jammy,now 1.43.0-1 amd64 [installed]
libuv1/jammy,now 1.43.0-1 amd64 [installed,automatic]
libuvc-dev/jammy 0.0.6-1.1 amd64
libuvc-doc/jammy 0.0.6-1.1 all
libuvc0/jammy 0.0.6-1.1 amd64

...这让我认为只有 1.43.0-1 可供安装apt-get,并且它已经安装了。

但libuv 的 GitHub 站点表明有更新的版本。

如何在我的 Ubuntu 实例上使用 libuv v1.45.0(或更高版本)apt-get?

虽然我的迫切需求是特定于 libuv 的,但我实际上想总体了解 Unix/Linux 生态系统的这个方面:驱动程序/包/等之间的关系是什么。似乎是“已发布”(例如根据其 GitHub 页面)与包管理器“可用”的内容,例如apt-get?如果用户想要一个软件包管理器无法提供的较新版本的软件包,他们应该怎么做?他们应该下载源代码并在本地编译吗?


更新:为什么我需要 1.45.0,即为什么我需要比我的包管理器提供的版本更高级的版本?

我的Linux机器是一个开发环境,我需要在其中编译到主机(即我们可以忽略这个问题的上下文的交叉编译)。我需要编译的应用程序(不是我编写的)依赖于uv_timespec64_t,这显然是在 libuv v1.45.0 中引入的(根据git merge/diff)。

因此,这就是这个问题的前提:我需要编译(到主机)一个应用程序,该应用程序依赖于比我的 Linux 发行版的包管理器提供的更新版本的 libuv 中的功能。


更新:这个问题有一个相关的后续问题:为什么不同的 Linux 发行版有不同的包格式(和包管理器)?

apt
  • 2 个回答
  • 87 Views
Martin Hope
StoneThrow
Asked: 2023-12-09 04:24:02 +0800 CST

何时/为什么 pkg-config 不返回库链接路径?

  • 5

pkg-config我想在我的Makefile中使用来查找libspa-0.2的链接路径。

我观察到pkg-config --libs libspa-0.2没有返回任何内容。

pkg-config为简单起见,我将通过直接从 shell运行来演示该问题,即不是从我的Makefile中运行。

$ uname -a
Linux MY_LINUX_PC 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$
$ sudo apt-get install -y libspa-0.2-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  libwebrtc-audio-processing1
Use 'sudo apt autoremove' to remove it.
Suggested packages:
  pipewire-doc
The following NEW packages will be installed:
  libspa-0.2-dev
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/81.7 kB of archives.
After this operation, 625 kB of additional disk space will be used.
Selecting previously unselected package libspa-0.2-dev:amd64.
(Reading database ... 34966 files and directories currently installed.)
Preparing to unpack .../libspa-0.2-dev_0.3.48-1ubuntu3_amd64.deb ...
Unpacking libspa-0.2-dev:amd64 (0.3.48-1ubuntu3) ...
Setting up libspa-0.2-dev:amd64 (0.3.48-1ubuntu3) ...
$
$ pkg-config --libs libspa-0.2

$

奇怪的是,pkg-config当要求报告libspa-0.2的 cflags 时,其行为与预期一致:

$ pkg-config --cflags libspa-0.2
-D_REENTRANT -I/usr/include/spa-0.2
$

这是libspa-0.2.pc的内容:

$ cat /usr/lib/x86_64-linux-gnu/pkgconfig/libspa-0.2.pc
prefix=/usr
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include

plugindir=${libdir}/spa-0.2

Name: libspa
Description: Simple Plugin API
Version: 0.2
Cflags: -I${includedir}/spa-0.2 -D_REENTRANT
$

...所以我期待pkg-config --libs libspa-0.2返回类似的东西/usr/lib/x86_64-linux-gnu。

为什么pkg-config --libs libspa-0.2返回空字符串?

如果知识渊博的回答者能够描述一下pkg-config、apt-get和各个.pc文件的内容之间的关系,我将不胜感激。

我想了解专门针对libspa-0.2-dev 的问题/观察到的行为,但如果有概括,我也想了解这一点。


更新:这很奇怪——看起来pkg-config正在对库链接路径的内容进行一些(智能)格式化/剥离。这是zlib.pc的内容——预安装的东西(这应该可以排除我的混乱):

$ cat /usr/lib/x86_64-linux-gnu/pkgconfig/zlib.pc
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
sharedlibdir=${libdir}
includedir=${prefix}/include

Name: zlib
Description: zlib compression library
Version: 1.2.11

Requires:
Libs: -L${libdir} -L${sharedlibdir} -lz
Cflags: -I${includedir}
$

...这就是pkg-config其库链接路径的报告:

$ pkg-config --libs zlib
-lz
$

...即它似乎正在剥离该-L${libdir} -L${sharedlibdir}部分。

至少行为是一致的......这可能意味着这不是一个“问题”,而是pkg-config. 但我无法弄清楚为什么它会这样做的理由:它何时以及为什么会删除库链接路径,即-L内容?

linux
  • 1 个回答
  • 47 Views
Martin Hope
StoneThrow
Asked: 2023-05-09 11:45:10 +0800 CST

systemd 以哪个用户身份启动服务?

  • 5

我想了解如何systemd启动服务,特别是服务以哪个用户身份启动,我想以在我的 Linux PC 上运行的 Jenkins 为例。

我知道那init是pid 1Linux 中所有进程之母,在我的例子中pid 1属于systemd,我可以从运行中看到top:

$ top
Tasks: 646 total,   1 running, 645 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.6 sy,  0.0 ni, 97.0 id,  1.3 wa,  0.0 hi,  0.1 si,  0.0 st
MiB Mem : 257826.8 total, 198695.4 free,  28529.6 used,  30601.7 buff/cache
MiB Swap: 262012.0 total, 262012.0 free,      0.0 used. 227579.3 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0  171284  11196   7904 S   0.3   0.0  31:49.54 systemd

我曾天真地假设因为systemd运行为root,所以它运行的所有服务都将以 root 身份运行。
但我认为詹金斯在我的电脑上运行admin。
我试图用它来systemctl确定 Jenkins 以哪个用户身份运行,但我没有在标准输出中看到任何用户信息:

user@linux_box:~$ systemctl status jenkins
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Fri 2023-05-05 11:50:06 PDT; 3 days ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 4915)
   Memory: 0B
   CGroup: /system.slice/jenkins.service

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
user@linux_box:~$

...所以我试过ps aux:

user@linux_box:~$ ps aux | grep jenkins
admin  2042  0.0  0.0  14164   196 ?        S    May05   0:00 /usr/bin/daemon --name=admin --inherit --env=JENKINS_HOME=/home/admin/jenkins --output=/var/log/jenkins/jenkins.log --pidfile=/var/run/admin/admin.pid -- /usr/bin/java -Djava.awt.headless=true -jar /home/admin/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
admin  2043  1.7  5.3 48146100 14118144 ?   Sl   May05  83:41 /usr/bin/java -Djava.awt.headless=true -jar /home/admin/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
admin 29932  0.0  0.0   6204   892 pts/1    S+   20:37   0:00 grep jenkins

...我认为最左边的栏是说 Jenkins 正在运行admin,不是吗?

有人可以解释一下,它systemd运行的用户与服务运行的用户之间的关系吗?如果答案可以将其与 Jenkins 在这台 Linux PC 上的具体情况联系起来,那就太好了。

systemd
  • 1 个回答
  • 28 Views
Martin Hope
StoneThrow
Asked: 2022-05-12 20:42:02 +0800 CST

除了 /etc/passwd 之外是否还有包含/定义我的 UID 的文件?

  • 11

尝试了解 UID 和 GID。
各种在线阅读使我相信我的 UID 保存在 中/etc/passwd,但在我工作的服务器上似乎并非如此:

$ whoami
user1
$ cat /etc/passwd | grep user1
$

除此之外是否有(其他)文件/etc/passwd可以包含我的 UID?

(我假设 UID 与 GID 相似,因为在某处有一个文件包含它。我在文件中找到了我感兴趣的 GID /etc/group)

我知道我可以使用 command 获取我的 UID id -u,但是对于这个问题,我特别有兴趣了解是否存在包含它的文件。

uid
  • 2 个回答
  • 1695 Views
Martin Hope
StoneThrow
Asked: 2019-12-06 16:04:39 +0800 CST

子shell是否默认并行运行?

  • 2

这个问题来自它的答案之一,即阅读Linuxtopia - Chapter 20. Subshel​​ls的建议。

Linuxtopia 网站上的这个声明让我有点困惑:

子shell 让脚本进行并行处理,实际上同时执行多个子任务。
https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshel​​ls.html

这是否意味着从脚本运行的子shell 总是与原始脚本并行运行?从实验上看,情况似乎并非如此,但我会很感激专家以一种或另一种方式确认。

#! /usr/bin/bash

# This script reliably prints:
# hello
# world
# 0
# ...implying that the the subshell is not run in parallel with this script.

(echo hello;
echo world)

echo $?

.

#! /usr/bin/bash

# This script prints:
# 0
# hello
# world
# ...implying that the the subshell is run in parallel with this script.

(echo hello;
echo world) &

echo $?

使用&Linuxtopia 站点可能意味着“ [让]脚本进行并行处理”吗?


注意:我熟悉&在 bash 中为命令添加后缀的概念......它将所述命令作为后台进程运行。所以我的问题更多的是关于在子shell中执行的命令是否默认作为后台/并行进程运行,或者是否在&此处添加也是导致后台/并行执行的原因。对我来说,Linuxtopia 文章的措辞暗示了前者,这似乎与观察不符。

bash shell-script
  • 1 个回答
  • 676 Views
Martin Hope
StoneThrow
Asked: 2019-12-03 13:21:51 +0800 CST

为什么 vnc 与 linux 锁屏的连接被“锁定”而无法输入密码?

  • 2

VNC从我的 Windows 机器上,我使用查看器/服务器连接到我的 Linux机器。

在 Linux 机器上,当我的会话超时并且在锁定屏幕启动后,如果我随后尝试使用 gui 通过 VNC 解锁,我似乎被永久“锁定”而无法在密码提示。更具体地说,似乎某些Enter字符流在 VNC 上不断流式传输,触发登录提示以为用户不断输入长度为 0 的密码:请注意所附屏幕截图中的“身份验证错误”语句,显示登录屏幕认为已输入某些内容。此外,如果我在这里进行压力测试,通过快速打字,“隐藏字符”符号中的一两个会出现,然后再次快速消失。一直以来,“身份验证错误”

我发现这种情况的解决方法是直接登录到 Linux 机器并运行此脚本:

$ while true; do loginctl unlock-session 2 > /dev/null 2>&1; sleep 1; done

...那个数字 ,2是我的“会话 ID”。该脚本具有在出现时关闭锁定屏幕(在一秒钟内)的效果 - 这不是最好的解决方案,但比无法输入密码的永久锁定要好。

为什么这是必要的?有人可以解释VNC查看器/服务器、Linux 机器上的锁定屏幕或任何其他相关软件发生了什么,以及为什么会出现一个持续不断的流,专门Enter发送VNC到 Linux 登录屏幕(或发生其他任何事情)使锁定屏幕不断报告“身份验证错误”,就好像提供了不正确的密码一样)?

请注意,当我通过锁屏时,在bashshell 中,似乎没有发送任何不希望的击键 - 即我可以键入、执行命令等,而不会受到任何意外击键的干扰。

相关(?)问题:如果这不会使主题混乱:请注意我运行的脚本在前台,即:

$ while true; do loginctl unlock-session 2 > /dev/null 2>&1; sleep 1; done

...不是...

$ while true; do loginctl unlock-session 2 > /dev/null 2>&1; sleep 1; done &

...如果我尝试脚本的后台版本,它具有一次性效果,即锁定屏幕仅在第一次运行时被关闭,但此后再也不会与脚本的前台版本相比,这似乎保持锁屏永远消失。在这种情况下,为什么变通方法脚本是在后台还是前台会有所不同?


环境细节:

$ uname -a
Linux linuxbox 5.3.11-100.fc29.x86_64 #1 SMP Tue Nov 12 20:41:25 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

.

$ vncserver -list

TigerVNC server sessions:

X DISPLAY # PROCESS ID
:1  2958

.

$ loginctl list-sessions
SESSION   UID USER    SEAT   TTY
      2  1000 user    seat0  tty2

1 sessions listed.

在此处输入图像描述

login vnc
  • 1 个回答
  • 6504 Views
Martin Hope
StoneThrow
Asked: 2019-11-02 12:38:49 +0800 CST

有没有办法逐字打印f $@?

  • 4

我想编写一个stdout与其$@逐字对应的脚本,包括任何潜在的双引号,没有换行符。

我试过的:

> cat ./script1    
#! /usr/bin/bash
printf "%s %s" $0 $@
echo -n $0 $@
echo -n "$0 $@"
> 
> ./script1 a "bc d"
./script1 abc d./script1 a bc d./script1 a bc d>

我希望我的脚本按如下方式运行:

> ./script1 a "bc d"
./script1 a "bc d">

有没有办法做到这一点?

bash
  • 2 个回答
  • 799 Views
Martin Hope
StoneThrow
Asked: 2019-04-07 20:35:56 +0800 CST

为什么每次“openssl passwd”的输出都不一样?

  • 7

openssl passwd 命令计算在运行时键入的密码的哈希值或列表中每个密码的哈希值。密码列表从命名文件中获取选项 -in 文件,从标准输入获取选项 -stdin,否则从命令行获取。UNIX 标准算法 crypt 和基于 MD5 的 BSD 密码算法 1 及其 Apache 变体 apr1 可用。

我理解术语“哈希”的意思是“将输入转换为输出,很难/不可能从中得出原始输入。” 更具体地说,散列后的输入:输出关系为N:M,其中M<=N(即可能发生散列冲突)。

为什么“ openssl passwd”的输出在相同的输入下连续运行?

> openssl passwd
Password:
Verifying - Password:
ZTGgaZkFnC6Pg
> openssl passwd
Password:
Verifying - Password:
wCfi4i2Bnj3FU
> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 "a"
$1$JhSBpnWc$oiu2qHyr5p.ir0NrseQes1

我一定不明白这个函数的目的,因为它看起来像在相同的输入上运行相同的哈希算法会产生多个唯一的输出。我想我对这种看似 N:M 输入:输出关系(其中 M>N)感到困惑。

linux openssl
  • 3 个回答
  • 12395 Views
Martin Hope
StoneThrow
Asked: 2019-01-04 10:57:10 +0800 CST

使用标准输入中的文件列表调用 tar 的便携式方法

  • 8

我想从目录的内容创建一个 .tgz 。我还想./从 tar'ed 内容中删除前导 " "。
我这样做如下:

cd /path/to/files/ && find . -type f | cut -c 3- | xargs czf /path/to/tgz/myTgz.tgz

我最近了解到 usingxargs可能不是解决此问题的最佳方法,因为如果 cmdline arg 列表太长,xargs可能会调用tar多次,并且建议我使用tar' 从标准输入读取输入文件列表的能力。我最终找到了这篇关于如何做到这一点的文章。但是,我发现建议...

cd /path/to/files/ && find . -type f | cut -c 3- | tar czf foo.tgz -T -

...似乎不便携。它在我的开发 PC 上运行良好,但在 busybox 目标上,运行相同的命令时出现以下错误:

tar: can't open '-': No such file or directory

所以,我的问题:是否有一种真正可移植/全局的方式来调用通过从标准输入(而不是 cmdline 参数)提供输入文件tar来创建一个?.tgz

(我无法选择安装/ /etctar等替代品。)gnutarbsdtar

(第二个问题:为什么“ -T -”参数tar表示“从”读取文件stdin?从tar手册页中,我只能找到“ -T”的意思:

获取名称以从 FILE 中提取或创建

...但我看不到任何对普通“ -”的引用)

tar io-redirection
  • 3 个回答
  • 5682 Views
Martin Hope
StoneThrow
Asked: 2018-08-25 10:35:57 +0800 CST

文件是只读的模糊原因?

  • 5

Linux 文件系统似乎有一层又一层的微妙之处,我偶然发现:

我有兴趣编辑这个文件:

[user@box ~]$ ls -l /a/b/c/foo.bar
-rw-rwxr-x    1 user   user      144529 Jan 26  2018 /a/b/c/foo.bar

看起来它应该是用户可写的user——真的吗?但是当我尝试在 vim 中编辑文件时,我得到一个“ W10: Warning: Changing a readonly file”警告。

我知道文件可写性依赖于其包含文件夹的权限。我认为包含文件夹需要具有执行权限 - 是吗?我假设所需的目录权限也一直延伸到/- 真的吗?

在我看来,上述文件的包含文件夹树具有执行权限:

[user@box ~]$ ls -ld /a/b/c/                                                                                    
drwxrwxrwx    2 user   user       36864 Mar  5 17:50 /a/b/c/
[user@box ~]$ ls -ld /a/b/           
drwxrwxr-x    4 user   user        4096 Sep 22  2017 /a/b/
[user@box ~]$ ls -ld /a/                
drwxrwxr-x    9 user   user        4096 Sep 15  2017 /a/
[user@box ~]$ ls -ld /     
drwxr-xr-x   24 root   root           0 Aug 24 10:48 /
[user@box ~]$ whoami
user

据我所知,相关树中的每个目录都具有执行权限。起初,我怀疑它是否与/被拥有有关root,但它具有“其他人”的执行权限。另外,如果存在与/由 拥有相关的问题root,我想我将无法以除 之外的用户身份在文件系统上的任何位置写入文件root,但事实并非如此。

任何人都可以想到/确定指出文件被视为只读的其他原因吗?

linux files
  • 1 个回答
  • 5721 Views
Martin Hope
StoneThrow
Asked: 2018-06-09 10:20:22 +0800 CST

为什么“ps ax”找不到没有“#!”的正在运行的 bash 脚本 标题?

  • 13

当我运行这个脚本时,打算运行直到被杀死......

# foo.sh

while true; do sleep 1; done

...我无法使用以下方法找到它ps ax:

>./foo.sh

// In a separate shell:
>ps ax | grep foo.sh
21110 pts/3    S+     0:00 grep --color=auto foo.sh

...但是如果我只是将常见的“ #!”标题添加到脚本中...

#! /usr/bin/bash
# foo.sh

while true; do sleep 1; done

...然后脚本变得可以通过相同的ps命令找到...

>./foo.sh

// In a separate shell:
>ps ax | grep foo.sh
21319 pts/43   S+     0:00 /usr/bin/bash ./foo.sh
21324 pts/3    S+     0:00 grep --color=auto foo.sh

为什么会这样?
这可能是一个相关的问题:我认为“ #”只是一个评论前缀,如果是这样,“ #! /usr/bin/bash”本身只不过是一个评论。但是“ #!”是否具有比仅仅作为评论更大的意义?

shell-script shell
  • 3 个回答
  • 4003 Views
Martin Hope
StoneThrow
Asked: 2018-05-04 12:13:32 +0800 CST

是否保证具有相同根目录的两个子目录位于同一个挂载的文件系统上?

  • 6

cpp我正在使用的文件创建一个目录,即mkdir( path, ... ),其中路径来自环境变量(例如getenv( "FOO" );)。

例如,上面创建的$FOOis/foo和path是 `/foo/newPath/'。

对于我的问题场景,可能/foo/oldPath/存在并具有内容(假设没有其他子目录),在这种情况下,我想将文件/foo/oldPath/从/foo/newPath.

我的问题是:因为/foo/newPath/被创建为 的子目录,$FOO即具有相同的父目录,是否可以保证两个目录都在同一个“挂载文件系统”上?我对 Linux 上的挂载点和文件系统的理解充其量是微不足道的。/foo/newPath//foo/oldPath/

这个问题背后的背景是:如果/foo/newPath/并且/foo/oldPath/保证在同一个挂载的文件系统上,我可以使用它rename()来比其他替代方案更轻松地执行文件移动。oldPath该函数的手册页说,如果newPath不在同一个“挂载文件系统”上,它将失败。

linux filesystems
  • 3 个回答
  • 1244 Views
Martin Hope
StoneThrow
Asked: 2018-02-24 16:08:58 +0800 CST

从 Bash 运行的进程是否在“子 shell”中运行?

  • 1

当我从 Bash shell 运行可执行文件(如 a.out)时,该可执行文件是否在某种“子”shell 中运行,即与我输入的 shell 不同?

我将尝试用一个例子来说明我的问题。以下程序获取并打印环境变量的值,对其进行更改,然后重新获取并再次打印:

#include <iostream>
#include <string>
#include <cstdlib>
int main( int argc, char* argv[] )
{
  std::string str( getenv( "FOO" ) );
  std::cout << str << std::endl;
  setenv( "FOO", "bar", 1 );
  str = getenv( "FOO" );
  std::cout << str << std::endl;
  return 0;
}

现在,当我在 Bash 提示符下运行以下命令时,请注意输出:

>unset FOO && export FOO=foo && printf "$FOO\n" && ./a.out && printf "$FOO\n"
foo
foo
bar
foo
>
>unset FOO && export FOO=baz && printf "$FOO\n" && ./a.out && printf "$FOO\n"
baz
baz
bar
baz

所以我正在导出FOO,所以它可以从可执行文件中获取 - 我明白这一点。并且可执行文件的输出显示正在更改的环境变量。

但最终printf "$FOO\n"打印出可预执行的值。这是因为可执行文件在与我键入命令的“不同环境”中运行吗?

bash process
  • 1 个回答
  • 198 Views
Martin Hope
StoneThrow
Asked: 2018-02-23 15:45:20 +0800 CST

正斜杠封闭的 Bash 脚本函数名称(?)

  • 1

这是什么???

/\[*\]/ {
      inFoo = ($1 == "["foo"]")
      next
    }

由于封闭的大括号,它看起来像一个函数,但是在左大括号之前到底是什么?某种正则表达式的函数名?我从来都不擅长 Bash 脚本,但这完全无法理解。

有一个类似的,但它的主体太大(并且可能很敏感),我无法发布:

/.*/ {
    ...
    }
bash shell-script
  • 1 个回答
  • 580 Views

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve