我正在学习 C#,所以我做了一个 C# 小程序,上面写着Hello, World!,然后用以下命令编译mono-csc并运行它mono:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Run Code Online (Sandbox Code Playgroud)
我注意到当我TAB输入bash,Hello.exe被标记为可执行文件。事实上,它只通过一个加载文件名的 shell 运行!
Hello.exe是不是有一个有趣的文件扩展名的ELF文件:
$ readelf -a Hello.exe
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start
$ xxd Hello.exe | head -n1
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
Run Code Online (Sandbox Code Playgroud)
MZ意味着它是 Microsoft Windows 静态链接的可执行文件。把它放到一个 Windows 盒子上,它就会(应该)运行。
我已经wine安装了,但是wine,是用于的Windows应用程序的兼容层,需时约5倍,只要运行 …
我有一个来自这里的磁盘映像文件;该页面说我可以使用 QEMU 和以下命令启动此映像:
$ qemu-system-x86_64 -m 4096 -ctrl-grab -no-reboot x86-64.img
Run Code Online (Sandbox Code Playgroud)
这给出了一个信息:
WARNING: Image format was not specified for 'x86-64.img' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
Run Code Online (Sandbox Code Playgroud)
模拟器加载,但 PilOS 崩溃,这意味着我做错了什么:
(可能是因为 PilOS 想写入块 0 但不能)
该raw命令行参数,据我所知,这意味着这样传递:
$ qemu-system-x86_64 -drive format=raw file=x86-64.img
qemu-system-x86_64: -drive format=raw: drive with bus=0, unit=0 (index=0) exists
Run Code Online (Sandbox Code Playgroud)
这失败了(我认为),因为我的引导设备在/dev/sda总线 0 …
'sort -u' 的合理可扩展性限制是多少?(在“行长”,“行数”,“总文件大小”的维度?)
对于在“行数”维度上超过此值的文件,Unix 替代品是什么?(当然我可以轻松实现一个,但我想知道是否有一些标准的 Linux 命令可以完成?)
我有 200 GB 的可用磁盘空间、16 GB 的 RAM(其中约 1 GB 被桌面和内核占用)和 6 GB 的交换空间。
我有一个 240 GB 的外部 SSD,使用了 70 GB 1,其余的免费,我需要将其备份到我的磁盘。
通常,我会dd if=/dev/sdb of=Desktop/disk.img先创建磁盘,然后对其进行压缩,但是首先制作映像不是一种选择,因为这样做需要比我拥有的磁盘空间多得多的磁盘空间,即使压缩步骤会导致可用空间被压缩,因此最终存档可以很容易地放在我的磁盘上。
dd默认情况下写入 STDOUT,并且gzip可以从 STDIN 读取,所以理论上我可以写入dd if=/dev/sdb | gzip -9 -,但gzip读取字节所需的时间比dd产生它们的时间要长得多。
来自man pipe:
写入管道写端的数据由内核缓冲,直到从管道的读端读取。
我将 a 想象|成一个真正的管道——一个应用程序将数据推入,另一个应用程序尽可能快地从管道队列中取出数据。
当左侧的程序写入的数据比管道的另一侧希望处理的数据多时,该怎么办?它会导致极端的内存或交换使用,还是内核会尝试在磁盘上创建一个 FIFO,从而填满磁盘?或者SIGPIPE Broken pipe如果缓冲区太大它会失败吗?
基本上,这归结为两个问题:
注 1:我不能仅仅复制前 70 个使用的 GB 并期望获得一个工作系统或文件系统,因为碎片和其他需要完整内容完整的东西。
我想编写一个小 bash 函数,以便我可以告诉 bash,import os或者from sys import stdout它会生成一个新的 Python 解释器,并导入模块。
后一个from函数如下所示:
from () {
echo "from $@" | xxd
python3 -i -c "from $@"
}
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼:
$ from sys import stdout
00000000: 6672 6f6d 2073 7973 2069 6d70 6f72 7420 from sys import
00000010: 7374 646f 7574 0a stdout.
File "<string>", line 1
from sys
^
SyntaxError: invalid syntax
>>>
Run Code Online (Sandbox Code Playgroud)
中的字节from sys是
66 72 6f 6d 20 73 79 73 20
f …Run Code Online (Sandbox Code Playgroud) Unix / Linux EOL 是 LF、换行、ASCII 10、转义序列\n。
这是一个 Python 代码片段,可以准确地获得一个按键:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
Run Code Online (Sandbox Code Playgroud)
当我按下Enter键盘以响应此代码段时,它给出了\r回车符 ASCII 13。
在Windows 上,Enter发送CR LF == 13 10. *nix 不是 Windows;为什么Enter给 13 而不是 10?
在脚本中,错误通常用 发送到文件描述符 2 &2,即:
echo "error" >&2
Run Code Online (Sandbox Code Playgroud)
有时/dev/stderr改为使用:
echo "error" > /dev/stderr
Run Code Online (Sandbox Code Playgroud)
看着/dev/stderr,我看到它只是到 的符号链接/proc/self/fd/2,而后者又是到/dev/pts/5(在我当前的终端上)的符号链接。
看起来有点过于复杂了。这背后有什么逻辑吗?
使用/dev/stderr和&2等效吗?
其中任何一个都比另一个更受欢迎吗?
是否有任何工具/技巧可用于扩展变量以使 bash 代码更易于阅读?
例如,它将转换以下内容:
DIR=/var/tmp
FILE=${DIR}/file
SCRIPT_ROOT=/opt/root
TOOL=${SCRIPT_ROOT}/tool.sh
${TOOL} ${FILE}
Run Code Online (Sandbox Code Playgroud)
到:
DIR=/var/tmp
FILE=/var/tmp/file
SCRIPT_ROOT=/opt/root
TOOL=/opt/root/tool.sh
/opt/root/tool.sh /var/tmp/file
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的命令来反转十六进制数?
例如,给定十六进制数:
030201
Run Code Online (Sandbox Code Playgroud)
输出应该是:
010203
Run Code Online (Sandbox Code Playgroud)
使用该rev命令,我得到以下信息:
102030
Run Code Online (Sandbox Code Playgroud)
更新
$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1
Run Code Online (Sandbox Code Playgroud) 我正在编写一个模拟器,它依赖于生成(可能)非常大的问题域。由于数据无法放入 RAM,我使用 4 个四内存映射文件来保存它。这是一个在 64 位 Linux 上运行的 64 位应用程序,具有 8GB 的 RAM。
我的应用程序在多个线程中迭代内存映射并对它们执行读写操作。但是我的程序在启动后不久导致 OOM(没有发生颠簸):
[ 683.899682] Purging GPU memory, 25 pages freed, 12838 pages still pinned.
[ 683.899683] 50 and 0 pages still available in the bound and unbound GPU page lists.
[ 683.899732] Purging GPU memory, 0 pages freed, 12838 pages still pinned.
[ 683.899732] 50 and 0 pages still available in the bound and unbound GPU page lists.
[ 683.901441] gnome-shell invoked oom-killer: gfp_mask=0x240c0d0(GFP_TEMPORARY|__GFP_COMP|__GFP_ZERO), order=3, oom_score_adj=0
[ …Run Code Online (Sandbox Code Playgroud) bash ×2
command-line ×2
linux ×2
ascii ×1
compression ×1
dd ×1
disk-image ×1
executable ×1
gzip ×1
hex ×1
memory ×1
mmap ×1
mono ×1
newlines ×1
numeric-data ×1
pipe ×1
portability ×1
python ×1
qemu ×1
sort ×1
stderr ×1
terminal ×1
variable ×1