小编Wil*_*ard的帖子

在 Bash 中,何时使用别名、何时编写脚本以及何时编写函数?

我用了将近 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 初学者什么?

如果这不明显,我假设回答这个问题的人会使用所有三个选项。如果你只使用别名,或者只使用脚本,或者只使用函数——或者如果你只使用别名和脚本或别名和函数或脚本和函数——这个问题并不是真正针对你的。

bash alias shell-script function

399
推荐指数
9
解决办法
8万
查看次数

有效删除包含数千个文件的大目录

我们有一个文件夹变得笨重的问题,其中包含数十万个小文件。

执行rm -rf返回错误的文件太多了,而我们需要做的是:

find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;

这有效,但速度非常慢,并且经常因内存不足而失败。

有一个更好的方法吗?理想情况下,我想删除整个目录而不关心其中的内容。

linux command-line rm files

233
推荐指数
11
解决办法
34万
查看次数

curl 如何防止密码出现在 ps 输出中?

前段时间我注意到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)

security password ps curl arguments

72
推荐指数
2
解决办法
6812
查看次数

我刚刚将一个 49GB 的目录“mv”到一个错误的文件路径,是否可以恢复文件的原始状态?

我有(好吧,我)一个目录:

/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)

或者我应该放弃尝试恢复,因为文件可能已损坏和部分完整等?

  • 操作系统 - Ubuntu 16.04
/media/admin/my_data
Run Code Online (Sandbox Code Playgroud)

administration data-recovery files mv

60
推荐指数
2
解决办法
7786
查看次数

将一个文件重定向到另一个文件是否是 UUOC(对 cat 的无用使用)?

如果我想让 的内容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 起作用。

io-redirection file-copy files cat

37
推荐指数
4
解决办法
3983
查看次数

&amp;&amp; 和 || 之后的 bash 行续行在哪里 记录在案?

我在脚本中经常看到这个结构并自己使用它,但让我烦恼的是我似乎无法在文档中找到它。

例子:

[ -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)

bash shell-script

34
推荐指数
1
解决办法
1万
查看次数

bash 如果不是没有子shell的多个条件?

我想在一个 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 shell-script

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

Bash 中延迟挂起 (Ctrl-Y) 的目的是什么?

适用的 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吗?

bash signals job-control jobs

32
推荐指数
2
解决办法
3777
查看次数

使磁盘/磁盘复制变慢

有没有一种方法可以减慢 Linux 上的复制过程?

我有一个大文件,比如 10GB,我想将它复制到另一个目录,但我不想全速复制它。假设我想以 1mb/s 的速度复制它,而不是更快。我想使用标准的 Linuxcp命令。

这可能吗?(如果是,如何?)

编辑:因此,我将为我要实现的目标添加更多上下文。

在通过 USB 复制大文件(到 U 盘、U 盘等)时,我在 ArchLinux 系统上遇到了问题。填满 USB 缓冲区缓存后,我的系统停止响应(甚至鼠标停止;它只是偶尔移动)。复制操作仍在进行中,但它占用了 box 100% 的资源。当复制操作完成后,一切都恢复正常——一切又恢复了完美的响应。

也许是硬件错误,我不知道,但我知道我有两台机器有这个问题(都在 ArchLinux 上,一个是台式机,第二个是笔记本电脑)。

对此最简单和最快的“解决方案”(我同意这不是“真正的”解决方案,只是一个丑陋的“黑客”)是通过以 USB 驱动器的平均写入速度复制文件来防止此缓冲区填满,例如我这就够了。

linux performance file-copy limit block-device

31
推荐指数
5
解决办法
2万
查看次数

BusyBox 命令是真正内置的吗?

我在阅读著名的Unix Recovery Legend 时,突然想到:

如果我打开了一个 BusyBox shell,并且 BusyBox 二进制文件本身被删除了,我还能使用 BusyBox 二进制文件中包含的所有命令吗?

显然,我无法从另一个正在运行的 shell 中使用这些命令的 BB 版本,例如bash,因为 BusyBox 文件本身将无法bash打开和运行。但是在 BusyBox 的运行实例中,在我看来,BB 可以通过两种方法运行命令:

  1. 它可以派生并执行一个新的 BusyBox 实例,使用适当的名称调用它——并从磁盘读取 BusyBox 文件来执行此操作。
  2. 它可以分叉并执行一些内部逻辑来运行指定的命令(例如,通过将其作为函数调用运行)。

如果 (1) 是 BusyBox 的工作方式,我希望在删除 BB 二进制文件后,某些 BusyBox 提供的命令在 BB 的运行实例中将变得不可用。

如果 (2) 是它的工作原理,那么 BusyBox 甚至可以用于恢复 BB 本身已被删除的系统——前提是仍然可以访问 BusyBox 的一个正在运行的实例。

这在任何地方都有记录吗?如果没有,有没有办法安全地测试它?

busybox system-recovery

29
推荐指数
2
解决办法
3885
查看次数