尝试访问ls *.txt | wc -l包含许多文件的目录时出现以下错误:
-bash: /bin/ls: Argument list too long
Run Code Online (Sandbox Code Playgroud)
此“参数列表”的阈值是否取决于发行版或计算机的规格?通常,我wc -l会将如此大的结果的结果通过管道传递给其他一些命令(例如),所以我不关心终端的限制。
我不认为历史Unix 中的 shell/实用程序或像4.4BSD那样“最近”的东西支持使用双破折号(或两个连续的连字符)作为选项分隔符的结尾。使用FreeBSD,您可以看到例如在2.2.1 版本(1997)的rm 联机帮助页中引入的注释。但这只是一个命令的文档。
查看我能找到的最古老的GNU fileutils 更改日志,我看到了这个1(略有改动):
Tue Aug 28 18:05:24 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
* touch.c (main): Don't interpret first non-option arg as a <---
time if `--' is given (POSIX-required kludge).
* touch.c: Add long-named options.
* Many files: Include <getopt.h> instead of "getopt.h" since
getopt.h will be in the GNU /usr/include.
* install.c: Declare some …Run Code Online (Sandbox Code Playgroud) cd - 可以在当前目录和上一个目录之间切换。
似乎我以前见过-用作其他命令的参数,但我不记得 if-与cd.
我发现这-不适用于ls.
是- 只用cd吗?
我注意到它|用于将第一个命令的结果发送给另一个。我想杀死所有与名称匹配的进程。
这是 pgrep 通常所做的:
$ pgrep name
5089
5105
Run Code Online (Sandbox Code Playgroud)
并且多个参数似乎适用于kill:
sudo kill 5089 5105
Run Code Online (Sandbox Code Playgroud)
但这是错误的:
pgrep name | kill
Run Code Online (Sandbox Code Playgroud)
那么如何正确操作呢?
假设我想像这样通过 Bash 运行一个命令:
/bin/bash -c "ls -l"
Run Code Online (Sandbox Code Playgroud)
根据 Bash 手册页,我也可以这样运行它:
# don't process arguments after this one
# | pass all unprocessed arguments to command
# | |
# V V
/bin/bash -c ls -- -l
Run Code Online (Sandbox Code Playgroud)
除了它似乎不起作用(似乎被忽略了)。我做错了什么,还是我解释的手册页错误?
来自 man 的相关引用:
如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。
和
A -- 表示选项结束并禁用进一步的选项处理。-- 之后的任何参数都被视为文件名和参数。
在 bash shell 中,当我必须删除同一目录中的多个文件时,我目前需要执行以下操作:
rm /some/path/file1 /some/path/file2
有没有更短的方法来写这个,这样我就不必在/some/path/不使用变量或更改工作目录的情况下重新输入?
也许类似于:
rm /some/path/(file1,file2)
来自https://unix.stackexchange.com/a/458074/674
请记住
--在将任意参数传递给命令时使用(或在可能的情况下使用重定向)。所以sort -- "$f1"或更好,sort < "$f1"而不是sort "$f1".
为什么首选使用--和重定向?
为什么是sort < "$f1"首选sort -- "$f1"?
为什么是 sort -- "$f1"首选sort "$f1"?
谢谢。
我正在阅读一些如何使用 EFI 存根 (efistub) 加载 Linux 内核的教程。这些指令经常使用内核引导参数add_efi_memmap。预期的硬件是具有 8GB RAM 的 Intel x64。我当前的设置正在运行grub-efi引导加载程序和内核 v3.13。
GRUB引导,而不在add_efi_memmap引导参数:
23BIOS-e820 线数dmesg | grep BIOS-e820: | wc -l 243EFI 内存行计数dmesg | grep efi:\ mem | wc -l24保留的页面GRUB引导与 add_efi_memmap和EFI存储器映射大小似乎确实有所不同:
23 BIOS-e820线57 EFI 内存线22保留的页面EFI 存根启动没有 add_efi_memmap:
22 BIOS-e820线60 EFI …ls -a(我考虑-a一个选项)
sudo -u username( -u= 选项, username= arg)
chmod 664 my-dir( 664= 选项, my-dir= arg)
我想不出一个可能会说“这是一个标志”的例子,除非在查看目录列表时:
-r--------. 1 david david 3344 May 19 17:48 611056.pdf
Run Code Online (Sandbox Code Playgroud)
这为所有者设置了“读取标志”,仅此而已。是什么阻止我将其称为“阅读选项”?
我主要使用 DocBook XML 编写和编辑技术文档,我正在寻找差异的解释,尽可能一致和准确。但是,我已经看到了一种模式的形成:
setenforce 0我可以看到自己组合了标志和选项(有些选项可能有十几个可能的值,但布尔值只有两个)。参数看起来足够不同以维持它们的原样。
我有这个脚本,旨在下载您作为参数给出的单词的发音:
#!/bin/bash
m=$#
for ((i=1;i<=m;i++));do
echo $i
#wget https://ssl.gstatic.com/dictionary/static/sounds/de/0/"$i".mp3
done
Run Code Online (Sandbox Code Playgroud)
如果我通过这个命令运行它
./a.sh personality brave selfish
Run Code Online (Sandbox Code Playgroud)
它应该打印在标准输出上
personality
brave
selfish
Run Code Online (Sandbox Code Playgroud)
但它打印
1
2
3
Run Code Online (Sandbox Code Playgroud)
你能帮我解决这个问题吗?
ps:例如,如果我使用 $1 编写没有 for 循环的脚本,它将正常工作,但我想同时下载许多文件
arguments ×10
bash ×3
shell ×3
options ×2
boot ×1
cd-command ×1
command-line ×1
gnu ×1
history ×1
linux ×1
linux-kernel ×1
ls ×1
pipe ×1
posix ×1
quoting ×1
shell-script ×1
uefi ×1