我正在学习 Linux。我很惊讶地看到参数顺序在制作 tarball 时似乎很重要。
tar -cfvz casual.tar.gz snapback.txt bucket.txt
Run Code Online (Sandbox Code Playgroud)
给出错误:
tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Run Code Online (Sandbox Code Playgroud)
但是如果我发出这样的命令:
tar -cvzf casual.tar.gz snapback.txt bucket.txt
Run Code Online (Sandbox Code Playgroud)
tarball 的创建没有错误
谁能向我解释为什么参数顺序在这个例子中很重要,或者我可以在哪里找到这些信息来了解为什么?我按照我在第一个示例中所做的方式进行了尝试,该示例收到了一个错误,即首先放置所需参数 c 和 f 的逻辑,然后是我的其他参数。
我想完全吸收 Linux,包括理解为什么会发生这样的事情。提前致谢!
我想编写一个函数,我可以从具有许多不同变量的脚本中调用该函数。由于某些原因,我在这样做时遇到了很多麻烦。我读过的例子总是只使用一个全局变量,但就我所见,这不会使我的代码更具可读性。
预期用途示例:
#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4
add(){
result=$para1 + $para2
}
add $var1 $var2
add $var3 $var4
# end of the script
./myscript.sh 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
我尝试$1在函数中使用等,但是它只需要调用整个脚本的全局函数。基本上我正在寻找的是类似的东西$1,$2等等,但在函数的本地上下文中。如您所知,函数可以在任何适当的语言中工作。
我正在尝试在 bash 脚本中创建一个函数方法,该脚本执行由参数提供给该方法的命令。
意思是这样的:
special_execute()
{
# Some code
# Here's the point where the command gets executed
$@
# More code
}
special_execute echo "abc"
Run Code Online (Sandbox Code Playgroud)
我已经尝试过我$@,"$@",$*,"$*"我怎么能这样做呢?
根据文档,vga=从 GRUB2 开始不推荐使用内核参数。某些较新的内核似乎不再在某些适配器上支持它这一事实无关紧要,因为我拥有的显卡已有七到八年的历史了。
现在的问题是我想使用更高分辨率的文本模式,例如 80x50 而不是默认的 80x25 字符。显然,该显卡 (ATI Rage XL) 的所有图形 (VBE/VESA) 模式都不存在 - 可用模式列表仅0通过6. 6是80x60但看起来很可怕,所以我想用1(80x50)。
在获取可用模式列表后,我已经看到 80x50 和 80x60 在不支持默认模式(默认已注释掉GRUB_TERMINAL=console)并且提示我选择时工作。
如果我不应该在内核命令行上设置模式并且每次使用GRUB_GFXMODE(有或没有预加载vbe模块)并且GRUB_GFXPAYLOAD_LINUX=keep失败,我该如何设置模式?失败:屏幕保持空白,因为它是我在这台机器上使用的卡的无效图形模式?
我的想法是nomodeset仍然传递给内核,但是引导加载程序仍然必须设置图形模式。除了vga=内核参数之外,我看不到任何其他选项。
注意: GRUB2 控制台上的vbetest和videotest命令会使屏幕变黑,然后在声称没有视频输入后屏幕会切换到睡眠模式。vbeinfo并videoinfo显示除上述以外的一些可用模式,但没有提到应该在哪里设置。此外,当在内核命令行上传递vga=1(没有nomodeset)时,我看到一个关于它被弃用的非常简短的警告,但它太长而无法完全阅读 - 并且输出没有出现在dmesg.
我有一个功能可以快速创建一个新的 SVN 分支,看起来像这样
function svcp() { svn copy "repoaddress/branch/$1.0.x" "repoaddress/branch/dev/$2" -m "dev branch for $2"; }
Run Code Online (Sandbox Code Playgroud)
我用它来快速创建一个新分支,而无需查找和复制粘贴地址和其他一些东西。但是,对于消息(-m 选项),我想要它,以便如果我提供第三个参数,则将其用作消息,否则使用“dev branch for $2”的“默认”消息。有人可以解释这是如何完成的吗?
echo $-1, echo $-2, echo $-3..的输出是什么意思?
在我的一个 Linux 机器上,它显示了我:
echo $-1
imsBEl1
echo $-2
imsBEl2Run Code Online (Sandbox Code Playgroud)
在另一个 Linux 机器上,它显示:
echo $-1
himBH1
echo $-2
himBH2Run Code Online (Sandbox Code Playgroud)
它们是映射到某些内存位置还是其他东西?
my_test:
ifdef $(toto)
@echo 'toto is defined'
else
@echo 'no toto around'
endif
Run Code Online (Sandbox Code Playgroud)
$ make my_test
no toto around
$ make my_test toto
toto is defined
Run Code Online (Sandbox Code Playgroud)
$ make my_test
no toto around
$ make my_test toto
no toto around
make: *** No rule to make target `toto'. Stop.
Run Code Online (Sandbox Code Playgroud)
当我运行时,make my_test我按预期得到 else 文本no toto around。然而
make my_test toto
no toto around
make: *** No rule to make target `toto'. Stop.
Run Code Online (Sandbox Code Playgroud)
生成文件版本
$ make -v …Run Code Online (Sandbox Code Playgroud) 这个问题是完全通用的,不仅适用于我的情况,而且......我有一个小的 busybox 设备,我希望非 root 用户能够以 root 权限执行特定的脚本。例如,类似于这个启用 DHCP 的小脚本,其中$1在 cmdline (!!) 上发送的唯一变量 ( ) 是要发送的主机名:
#!/bin/bash
udhcpc -b -i eth0 -h $1
Run Code Online (Sandbox Code Playgroud)
像这样运行 udhcpc 需要 root 访问权限,因此为此我计划修改/etc/sudoers以包含以下行:
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
Run Code Online (Sandbox Code Playgroud)
这应该使“joe”能够通过简单地运行以root权限轻松运行该脚本:
sudo /path/to/enable_dhcp.sh
Run Code Online (Sandbox Code Playgroud)
并且没有被要求输入密码(这是我想要的,因为我希望 joe 能够编写此脚本)。
现在..我知道(或者至少我认为我知道)$1在一个可以很容易地以 root 权限运行的脚本中使用是一个可怕的想法,因为你可以注入任何你想要的东西。
那么......处理这个问题的最佳方法是什么?我如何让 joe 以 root 权限做我想做的事,允许他传入一个变量(或者像使用环境变量那样有效地这样做),同时又不会对注入攻击敞开大门?
我有点卡住了。我的任务是将参数以相反的顺序打印到我的脚本中,除了第三个和第四个。
我有的是这个代码:
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
Run Code Online (Sandbox Code Playgroud)
由于我讨厌 eval(向 PHP 致意),我正在寻找没有它的解决方案,但我找不到。
如何动态定义参数的位置?
PS:不,这不是作业,我正在为考试学习 shell,所以我尝试解决旧考试。
例如,如果我的脚本 ./foo 有 10 个参数,而我只想传递第 8 个参数。我目前知道如何做到这一点的唯一方法是:
./foo '' '' '' '' '' '' '' 'bar'
Run Code Online (Sandbox Code Playgroud)
有没有更简单/更好的方法?