小编rah*_*hmu的帖子

可执行文件在运行时在哪里查找共享对象?

我了解如何在链接/编译时定义包含共享对象。但是,我仍然想知道可执行文件*.so在执行时如何查找共享对象(库)。

例如,我的应用程序a.out调用lib.so库中定义的函数。编译后,我移动lib.so到我的$HOME.

我怎么知道a.out去那里找呢?

compiling path executable dynamic-linking

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

$* 和 $@ 有什么区别?

考虑以下代码:

foo () {
    echo $*
}

bar () {
    echo $@
}

foo 1 2 3 4
bar 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

它输出:

1 2 3 4

1 2 3 4

我正在使用 Ksh88,但我也对其他常见的 shell 感兴趣。如果您碰巧知道特定 shell 的任何特殊性,请务必提及它们。

我在 Solaris 上的 Ksh 手册页中找到了以下内容:

$* 和 $@ 的含义在不引用或用作参数赋值或文件名时是相同的。然而,当用作命令参数时,$* 等价于 ``$1d$2d...'',其中 d 是 IFS 变量的第一个字符,而 $@ 等价于 $1 $2 ....

我尝试修改IFS变量,但它不会修改输出。也许我做错了什么?

shell ksh quoting arguments

119
推荐指数
6
解决办法
4万
查看次数

如何测试 shell 脚本的 POSIX 合规性?

考虑到 POSIX 是所有 unices 中最接近通用标准的东西,我很想知道是否有专门支持它的 shell。尽管大多数现代 shell 都提供对 POSIX 的支持(并且可以毫无问题地运行 POSIX 兼容脚本),但它们在指出不兼容的功能方面做得不好。

是否有任何仅实现 POSIX 和 POSIX 的外壳程序,它会为任何不兼容的功能抛出错误?

编辑我想澄清一下,我不是要求编写可移植 shell 脚本的一般提示。评论中提到的相关问题已经涵盖了这一点。当我发现bash有一个--posix选项时,我想到了这个问题,但只是发现它只影响一些初始化行为,这并不是我正在寻找的。

shell shell-script posix

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

如何复制一些但不是所有文件?

因此,在目录上下文中*使用时,您可以将用作所有文件的通配符cp。有没有办法复制除文件之外的所有x文件?

shell bash wildcards

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

不同的 BSD 有什么共同点?

……它们之间有什么区别?我这样表述我的问题是为了明确表示我对意见之战不感兴趣,而是对不同风格的 BSD Unix 之间的客观比较感兴趣。理想情况下,我可以从在所有这些方面都有经验的用户那里得到反馈。

背景

我最近发现 Unix 不仅仅是 Linux。我在工作中使用 Solaris,它让我大开眼界。现在我对新的 unices 感兴趣,我想尝试一个新的 unices,我自然对 BSD 很好奇。

问题

我不是在寻求关于安装什么 BSD 的建议或意见;我想知道它们之间的差异(和共同点),以便我可以下定决心。问题是很难在它们之间进行适当的比较。

如果幸运的话,你会得到一些像这样草率的定义:

FreeBSD = Popular all-rounder.
NetBSD = Portable (runs on a lot of platforms, including a toaster)
OpenBSD = Security above anything else.
Run Code Online (Sandbox Code Playgroud)

(这可能是真的,但它并不是真的有用。我确信 FreeBSD 也是可移植和安全的......)

如果你不走运,你会陷入那些不可避免的 Unix 传说中的一个,关于项目拆分、分叉、基于知识/道德理由重新命名,Theo de Raadt 如何是一个极端主义者,以及 MacOS X 和 FreeBSD 如何在 20 多年前有一个共同的祖先。

引人入胜,但不是真正的信息,是吗?

BSD

我感兴趣的 BSD 是:

  • FreeBSD
  • 开放式BSD
  • NetBSD

和可选

  • 蜻蜓
  • 达尔文
  • ...

我的问题

为了更好地理解差异,这里有一个关于不同分布的一些相关问题的列表(我们可以使用这个术语吗?)。如果您在某种形式的表格数据下提出您的答案,那么您就是我的英雄!

  • 他们使用相同的内核吗?
  • 他们使用相同的用户空间工具吗?(有什么区别,如果有的话?)
  • 他们使用相同的包/源管理系统吗?
  • 他们使用相同的默认外壳吗?
  • 二进制文件可以在它们之间移植吗?
  • 来源是否可以在它们之间移植?
  • 他们使用不同的目录树吗? …

bsd distribution-choice

61
推荐指数
2
解决办法
8966
查看次数

将 `rm` 移至垃圾箱

是否有一个 Linux 脚本/应用程序,而不是删除文件,而是将它们移动到一个特殊的“垃圾”位置?我想用它来代替rm(甚至可能是后者的别名;这样做有利有弊)。

“垃圾”是指一个特殊的文件夹。单个mv $* ~/.trash是第一步,但理想情况下,这还应该处理多个同名文件的垃圾处理,而不会覆盖旧的垃圾文件,并允许使用简单的命令(一种“撤消”)将文件恢复到其原始位置。此外,如果在重新启动时自动清空垃圾(或防止无休止增长的类似机制),那就太好了。

存在针对此问题的部分解决方案,但“恢复”操作尤其重要。是否有任何现有的解决方案不依赖图形外壳中的垃圾系统?

(顺便说一句,这种方法是否合理,而不是使用频繁的备份和 VCS 是否合理,一直存在无休止的讨论。虽然这些讨论有一定的意义,但我相信我的要求仍然存在。)

shell rm

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

如何在单列上运行grep?

我想 grepls -l命令的输出:

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file
Run Code Online (Sandbox Code Playgroud)

我只想grep rahmu在 $3 列上运行,因此我的grep命令的输出应如下所示:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file
Run Code Online (Sandbox Code Playgroud)

最简单的方法是什么?答案必须可以在许多 Unices 之间移植,最好侧重于 Linux 和 Solaris。

注意:我不是在寻找一种方法来查找属于给定用户的所有文件。这个例子只是为了让我的问题更清楚。

grep awk

50
推荐指数
4
解决办法
24万
查看次数

局部变量赋值需要引号吗?

我可以安全地省略本地作业右侧的引号吗?

function foo {
    local myvar=${bar}
    stuff()
}
Run Code Online (Sandbox Code Playgroud)

我主要对 感兴趣bash,但欢迎提供有关其他 shell 中的边角案例的任何信息。

shell-script quoting assignment

48
推荐指数
1
解决办法
9294
查看次数

find -exec + vs find | xargs:选择哪一个?

我知道-exec可以+选择模仿xargs. 是否存在您更喜欢一种形式而不是另一种形式的情况?

我个人倾向于更喜欢第一种形式,如果只是为了避免使用管道。我find相信开发人员一定已经做了适当的优化。我对么?

bash pipe find xargs

38
推荐指数
4
解决办法
2万
查看次数

在 find -exec 调用中执行用户定义的函数

我在 Solaris 10 上使用 ksh (88)、bash (3.00) 和 zsh (4.2.1) 测试了以下内容。

以下代码不会产生任何结果:

function foo {
    echo "Hello World"
}

find somedir -exec foo \;
Run Code Online (Sandbox Code Playgroud)

这一发现不匹配多个文件(如更换-exec ...-print),并从外面叫时功能完美的作品find调用。

以下是该man find页面的内容-exec

 -exec command 如果执行的命令返回一个,则为真
                     零值作为退出状态。结尾
                     命令必须以转义字符作为标点
                     分号 (;)。命令参数 {} 是
                     替换为当前路径名。如果
                     -exec 的最后一个参数是 {} 而你
                     指定 + 而不是分号 (;),
                     命令被调用的次数更少,
                     {} 替换为路径名组。如果
                     命令的任何调用都会返回一个
                     非零值作为退出状态,找到
                     返回非零退出状态。

我可能会做这样的事情:

for f in $(find somedir); do
    foo
done
Run Code Online (Sandbox Code Playgroud)

但我害怕处理字段分隔符问题。

是否可以从调用中调用 shell 函数(在同一个脚本中定义,让我们不要理会范围问题)find ... -exec ...? …

solaris ksh find shell-script function

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