我了解如何在链接/编译时定义包含共享对象。但是,我仍然想知道可执行文件*.so
在执行时如何查找共享对象(库)。
例如,我的应用程序a.out
调用lib.so
库中定义的函数。编译后,我移动lib.so
到我的$HOME
.
我怎么知道a.out
去那里找呢?
考虑以下代码:
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
变量,但它不会修改输出。也许我做错了什么?
考虑到 POSIX 是所有 unices 中最接近通用标准的东西,我很想知道是否有专门支持它的 shell。尽管大多数现代 shell 都提供对 POSIX 的支持(并且可以毫无问题地运行 POSIX 兼容脚本),但它们在指出不兼容的功能方面做得不好。
是否有任何仅实现 POSIX 和 POSIX 的外壳程序,它会为任何不兼容的功能抛出错误?
编辑我想澄清一下,我不是要求编写可移植 shell 脚本的一般提示。评论中提到的相关问题已经涵盖了这一点。当我发现bash
有一个--posix
选项时,我想到了这个问题,但只是发现它只影响一些初始化行为,这并不是我正在寻找的。
因此,在目录上下文中*
使用时,您可以将用作所有文件的通配符cp
。有没有办法复制除文件之外的所有x
文件?
……它们之间有什么区别?我这样表述我的问题是为了明确表示我对意见之战不感兴趣,而是对不同风格的 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 是:
和可选
我的问题
为了更好地理解差异,这里有一个关于不同分布的一些相关问题的列表(我们可以使用这个术语吗?)。如果您在某种形式的表格数据下提出您的答案,那么您就是我的英雄!
是否有一个 Linux 脚本/应用程序,而不是删除文件,而是将它们移动到一个特殊的“垃圾”位置?我想用它来代替rm
(甚至可能是后者的别名;这样做有利有弊)。
“垃圾”是指一个特殊的文件夹。单个mv $* ~/.trash
是第一步,但理想情况下,这还应该处理多个同名文件的垃圾处理,而不会覆盖旧的垃圾文件,并允许使用简单的命令(一种“撤消”)将文件恢复到其原始位置。此外,如果在重新启动时自动清空垃圾(或防止无休止增长的类似机制),那就太好了。
存在针对此问题的部分解决方案,但“恢复”操作尤其重要。是否有任何现有的解决方案不依赖图形外壳中的垃圾系统?
(顺便说一句,这种方法是否合理,而不是使用频繁的备份和 VCS 是否合理,一直存在无休止的讨论。虽然这些讨论有一定的意义,但我相信我的要求仍然存在。)
我想 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。
注意:我不是在寻找一种方法来查找属于给定用户的所有文件。这个例子只是为了让我的问题更清楚。
我可以安全地省略本地作业右侧的引号吗?
function foo {
local myvar=${bar}
stuff()
}
Run Code Online (Sandbox Code Playgroud)
我主要对 感兴趣bash
,但欢迎提供有关其他 shell 中的边角案例的任何信息。
我知道-exec
可以+
选择模仿xargs
. 是否存在您更喜欢一种形式而不是另一种形式的情况?
我个人倾向于更喜欢第一种形式,如果只是为了避免使用管道。我find
相信开发人员一定已经做了适当的优化。我对么?
我在 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 ...
? …