我用了将近 10 年的 Linux 才问出这个问题。这都是反复试验和随机深夜上网。
但是人们不应该为此需要10年。如果我刚开始使用 Linux,我想知道:何时使用别名、何时编写脚本以及何时编写函数?
就别名而言,我将别名用于不带参数的非常简单的操作。
alias houston='cd /home/username/.scripts/'
Run Code Online (Sandbox Code Playgroud)
这似乎很明显。但有些人这样做:
alias command="bash bashscriptname"
Run Code Online (Sandbox Code Playgroud)
(并将其添加到.bashrc文件中)
这样做有充分的理由吗?我真的很努力,但我真的想不出任何我想要这样做的情况。因此,如果存在会产生影响的边缘情况,请在下面回答。
因为那是我将一些东西放入我的 PATH 和chmod +x它的地方,这是经过多年 Linux 反复试验后出现的另一件事。
这让我进入下一个话题。例如,我.scripts/通过在我的.bashrc( PATH=$PATH:/home/username/.scripts/) 中添加一行,在主目录中添加了一个隐藏文件夹 ( ) 到我的 PATH ,因此那里的任何可执行文件都会自动自动完成。
如果我需要的话。
不过,我真的不需要那个,不是吗?我只会将它用于不是 shell 的语言,比如 Python。
如果是 shell,我可以在里面写一个函数.bashrc:
funcname () {
somecommand -someARGS "$@"
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,我通过反复试验发现了很多。只有当我的电脑没电了,我才真正看到了功能之美,我不得不在周围人不使用它们的时候使用它们。
我没有将整个脚本目录从计算机移动到计算机,而是将其他人的 .bashrc 替换为我自己的,因为他们甚至从未进行过任何修改。
但我错过了什么吗?
那么,关于何时使用别名、何时编写脚本以及何时编写函数,您会告诉 Linux 初学者什么?
如果这不明显,我假设回答这个问题的人会使用所有三个选项。如果你只使用别名,或者只使用脚本,或者只使用函数——或者如果你只使用别名和脚本或别名和函数或脚本和函数——这个问题并不是真正针对你的。
我们有一个文件夹变得笨重的问题,其中包含数十万个小文件。
执行rm -rf返回错误的文件太多了,而我们需要做的是:
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
这有效,但速度非常慢,并且经常因内存不足而失败。
有一个更好的方法吗?理想情况下,我想删除整个目录而不关心其中的内容。
前段时间我注意到curl作为命令行参数提供的用户名和密码没有出现在ps输出中(尽管它们当然可能出现在您的 bash 历史记录中)。
它们同样不会出现在/proc/PID/cmdline.
(不过,可以推导出组合的用户名/密码参数的长度。)
演示如下:
[root@localhost ~]# nc -l 80 &
[1] 3342
[root@localhost ~]# curl -u iamsam:samiam localhost &
[2] 3343
[root@localhost ~]# GET / HTTP/1.1
Authorization: Basic aWFtc2FtOnNhbWlhbQ==
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: localhost
Accept: */*
[1]+ Stopped nc -l 80
[root@localhost ~]# jobs
[1]+ Stopped nc -l 80
[2]- Running curl -u iamsam:samiam localhost &
[root@localhost ~]# ps -ef | grep curl
root 3343 3258 0 …Run Code Online (Sandbox Code Playgroud) 我有(好吧,我有)一个目录:
/media/admin/my_data
Run Code Online (Sandbox Code Playgroud)
它的大小约为 49GB,其中包含数万个文件。该目录是活动 LUKS 分区的挂载点。
我想将目录重命名为:
/media/admin/my_data_on_60GB_partition
Run Code Online (Sandbox Code Playgroud)
我当时没有意识到,但我从主目录发出了命令,所以我最终做了:
~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Run Code Online (Sandbox Code Playgroud)
然后mv程序开始移动,/media/admin/my_data并将其内容移动到一个新目录~/my_data_on_60GB_partition。
我使用Ctrl+C来取消命令,所以现在我有一大堆跨目录的文件:
~/my_data_on_60GB_partition <--- about 2GB worth files in here
Run Code Online (Sandbox Code Playgroud)
和
/media/admin/my_data <---- about 47GB of orig files in here
Run Code Online (Sandbox Code Playgroud)
新目录~/my_data_on_60GB_partition及其一些子目录归 root 所有。
我假设mv程序最初必须以 root 身份复制文件,然后在传输后将chown它们复制回我的用户帐户。
我有一个目录/分区的旧备份。
我的问题是,是否有可能可靠地恢复移动的一堆文件?
也就是说,我可以运行:
sudo mv ~/my_data_on_60GB_partition/* /media/admin/my_data
Run Code Online (Sandbox Code Playgroud)
或者我应该放弃尝试恢复,因为文件可能已损坏和部分完整等?
/media/admin/my_data
Run Code Online (Sandbox Code Playgroud) 如果我想让 的内容file2匹配 的内容file1,我显然可以直接运行cp file1 file2.
但是,如果我想保留一切有关file2 除了内容所有者,权限,扩展属性,ACL的,硬链接,等等等等,那么我就不会想运行cp。*在这种情况下,我只是想在扑通file1into 的内容file2。
似乎以下内容可以做到:
< file1 > file2
Run Code Online (Sandbox Code Playgroud)
但它不起作用。 file2被截断为空且不写入。然而,
cat < file1 > file2
Run Code Online (Sandbox Code Playgroud)
确实有效。
我很惊讶第一个版本不起作用。
第二个版本是UUOC吗?有没有办法在不调用命令的情况下仅通过使用重定向来做到这一点?
注意:我知道 UUOC 与其说是真正的反模式,不如说是一种迂腐的观点。
*正如tniles09 发现的那样,实际上在这种情况下cp 会起作用。
我在脚本中经常看到这个结构并自己使用它,但让我烦恼的是我似乎无法在文档中找到它。
例子:
[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."
Run Code Online (Sandbox Code Playgroud)
这也可以在换行符之前使用反斜杠来完成,如中所述man bash:
If a \<newline> pair appears, and the backslash is not
itself quoted, the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).
Run Code Online (Sandbox Code Playgroud)
例子:
[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \ …Run Code Online (Sandbox Code Playgroud) 我想在一个 shell if 语句中组合多个条件,并否定组合。对于条件的简单组合,我有以下工作代码:
if [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ; then
# do stuff with the files
fi
Run Code Online (Sandbox Code Playgroud)
这工作正常。如果我想否定它,我可以使用以下工作代码:
if ! ( [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ) ; then
echo "Error: You done goofed."
exit 1
fi
# do stuff with the files
Run Code Online (Sandbox Code Playgroud)
这也按预期工作。但是,我突然想到我不知道括号实际上在做什么。我想将它们仅用于分组,但它实际上是否产生了一个子外壳?(我怎么知道?)如果是这样,有没有办法在不产生子shell的情况下对条件进行分组?
适用的 Bash 手册页的完整部分仅说明:
如果运行 bash 的操作系统支持作业控制,则 bash 包含使用它的工具。在进程运行时输入挂起字符(通常是 ^Z、Control-Z)会导致该进程停止并将控制权返回给 bash。 输入延迟挂起字符(通常是 ^Y、Control-Y)会导致进程在尝试从终端读取输入时停止,并将控制权返回给 bash。 然后用户可以操纵这个作业的状态,使用
bg命令在后台继续它,fg命令在前台继续它,或 kill 命令将它杀死。A ^Z 立即生效,并具有导致挂起输出和预先输入被丢弃的额外副作用。
我从来没有用过Ctrl- Y; 我只是刚刚了解它。我只用Ctrl- Z(暂停)做得很好。
我试图想象这个选项的用途。什么时候有用?
(请注意,此功能并非在所有 Unix 变体上都存在。它存在于Solaris和 OpenBSD 上,但不存在于 Linux 或 FreeBSD 上。相应的设置是stty dsusp。)
也许不那么主观:有什么可以用Ctrl-Y不能用Ctrl-轻松完成的事情Z吗?
有没有一种方法可以减慢 Linux 上的复制过程?
我有一个大文件,比如 10GB,我想将它复制到另一个目录,但我不想全速复制它。假设我想以 1mb/s 的速度复制它,而不是更快。我想使用标准的 Linuxcp命令。
这可能吗?(如果是,如何?)
编辑:因此,我将为我要实现的目标添加更多上下文。
在通过 USB 复制大文件(到 U 盘、U 盘等)时,我在 ArchLinux 系统上遇到了问题。填满 USB 缓冲区缓存后,我的系统停止响应(甚至鼠标停止;它只是偶尔移动)。复制操作仍在进行中,但它占用了 box 100% 的资源。当复制操作完成后,一切都恢复正常——一切又恢复了完美的响应。
也许是硬件错误,我不知道,但我知道我有两台机器有这个问题(都在 ArchLinux 上,一个是台式机,第二个是笔记本电脑)。
对此最简单和最快的“解决方案”(我同意这不是“真正的”解决方案,只是一个丑陋的“黑客”)是通过以 USB 驱动器的平均写入速度复制文件来防止此缓冲区填满,例如我这就够了。
我在阅读著名的Unix Recovery Legend 时,突然想到:
如果我打开了一个 BusyBox shell,并且 BusyBox 二进制文件本身被删除了,我还能使用 BusyBox 二进制文件中包含的所有命令吗?
显然,我无法从另一个正在运行的 shell 中使用这些命令的 BB 版本,例如bash,因为 BusyBox 文件本身将无法bash打开和运行。但是在 BusyBox 的运行实例中,在我看来,BB 可以通过两种方法运行命令:
如果 (1) 是 BusyBox 的工作方式,我希望在删除 BB 二进制文件后,某些 BusyBox 提供的命令在 BB 的运行实例中将变得不可用。
如果 (2) 是它的工作原理,那么 BusyBox 甚至可以用于恢复 BB 本身已被删除的系统——前提是仍然可以访问 BusyBox 的一个正在运行的实例。
这在任何地方都有记录吗?如果没有,有没有办法安全地测试它?
bash ×4
files ×3
shell-script ×3
file-copy ×2
linux ×2
alias ×1
arguments ×1
block-device ×1
busybox ×1
cat ×1
command-line ×1
curl ×1
function ×1
job-control ×1
jobs ×1
limit ×1
mv ×1
password ×1
performance ×1
ps ×1
rm ×1
security ×1
signals ×1