我在我的.bashrc文件中设置了几个功能。我只想显示函数的实际代码而不执行它,以便快速引用某些内容。
有什么办法,我们可以看到函数定义?
针对 CVE-2014-6271 安全问题更新 bash 时遇到此错误:
# yum update bash
Running transaction (shutdown inhibited)
Updating : bash-4.2.47-4.fc20.x86_64
/bin/sh: error importing function definition for `some-function'
Run Code Online (Sandbox Code Playgroud) 有什么方法可以根据旧定义重新定义 bash 函数?例如,我想将以下代码块添加到函数的序言中command_not_found_handle (),
# Check if $1 is instead a bash variable and print value if it is
local VAL=$(eval echo \"\$$1\")
if [ -n "$VAL" ] && [ $# -eq 1 ]; then
echo "$1=$VAL"
return $?
fi
Run Code Online (Sandbox Code Playgroud)
它目前在 /etc/profile.d/PackageKit.sh 中定义并由 bash 启动脚本提供。
这样我就可以在命令提示符下通过简单地输入变量名称来查询环境变量的值(并且假设不存在该名称的此类命令)。例如
user@hostname ~:$ LANG
LANG=en_AU.utf8
Run Code Online (Sandbox Code Playgroud)
我知道我可以复制并粘贴当前定义并在 中添加我自己的更改~/.bashrc,但我正在寻找一种更优雅的方式来重用代码。
实现我的目标或代码改进/扩展的更好方法也受到赞赏。
使用扩展的 Unicode 字符(毫无疑问)对许多用户很有用。
更简单的 shell(ash(busybox)、dash)和 ksh 会失败:
tést() { echo 34; }
tést
Run Code Online (Sandbox Code Playgroud)
我知道 POSIX有效函数名称使用Names 的这个定义。这意味着这个正则表达式:
[a-zA-Z_][a-zA-Z0-9_]*
Run Code Online (Sandbox Code Playgroud)
但是,在第一个链接中还说:
实现可能允许函数名称中的其他字符作为扩展名。
问题是:
相关问题:是否
可以在 shell 函数名称中使用特殊字符?
我对在函数名称中使用元字符 (>) 不感兴趣。
包含“-”的 Upstart 和 bash 函数名称
我不认为运算符(减法“-”)应该是名称的一部分。
当我使用dfor 时mount,我最感兴趣的是物理磁盘分区。如今,这些命令的输出被临时和虚拟文件系统、cgroup 和其他我经常不感兴趣的东西所淹没。
我在输出中的物理分区总是以 ' /'开头,所以我尝试为dfand制作别名mount:
alias df1="df | egrep '^/'"
alias mount1="mount | egrep '^/'"
Run Code Online (Sandbox Code Playgroud)
这适用于mount1(虽然它/以红色显示 ' '),但因为df1我有时想将-h选项添加到df并且不能做df1 -h。我不想为我可能想要使用的每个选项组合使用别名。我真的需要研究在 bash 中定义函数吗(我不想这样做)?有更好的解决方案df1吗?
所以我一直在编辑 bashrc,并且我打开了一个带有工作函数定义的终端,尽管 bashrc 已经用错误的函数定义进行了更新。(因为在我获取更新的 bashrc 之前定义不会改变)在这种情况下如何查找工作函数定义?例如,如果我输入:
alias function_name
Run Code Online (Sandbox Code Playgroud)
我可以看到该别名的定义是什么。是否有类似功能的命令?如果没有,是否有命令可以输出当前终端正在使用的整个 bashrc?
我正在尝试创建一个 bash 别名,其中别名本身有一个空格。
这个想法是别名(即con)代表sudo openvpn --config /path/to/my/openvpn/configs/. 当使用con别名时,这会产生可读的命令。
IE: `con uk.conf` == `sudo openvpn --config /path/to/my/openvpn/configs/uk.conf`
我明白,我不能宣布这样的别名:
con ="sudo openvpn --config /path/to/my/openvpn/configs/"。bash 函数会在这种情况下工作吗?我从来没有听说过,但是在研究这个小问题的解决方案时。
我在 my 中定义了许多函数.bashrc,旨在在终端中交互使用。我通常在它们之前添加一条描述其预期用途的评论:
# Usage: foo [bar]
# Foo's a bar into a baz
foo() {
...
}
Run Code Online (Sandbox Code Playgroud)
如果浏览源代码,这很好,但是type在终端中运行以快速提醒该函数的作用是很好的。然而,这(可以理解)不包括评论:
$ type foo
foo is a function
foo ()
{
...
}
Run Code Online (Sandbox Code Playgroud)
这让我想到“如果这种评论持续存在以便type可以显示它们,那不是很好吗?” 本着 Python文档字符串的精神,我想出了这个:
foo() {
: Usage: foo [bar]
: "Foo's a bar into a baz"
...
}
$ type foo
foo is a function
foo ()
{
: Usage: foo [bar];
: "Foo's a bar into a baz";
...
} …Run Code Online (Sandbox Code Playgroud) 查看 的输出env,我注意到还有以下函数。
BASH_FUNC_mc%%=() { . /usr/share/mc/mc-wrapper.sh
}
Run Code Online (Sandbox Code Playgroud)
/usr/share/mc/mc-wrapper.sh 文件的内容如下。
MC_USER=`id | sed 's/[^(]*(//;s/).*//'`
MC_PWD_FILE="${TMPDIR-/tmp}/mc-$MC_USER/mc.pwd.$$"
/usr/bin/mc -P "$MC_PWD_FILE" "$@"
if test -r "$MC_PWD_FILE"; then
MC_PWD="`cat "$MC_PWD_FILE"`"
if test -n "$MC_PWD" && test -d "$MC_PWD"; then
cd "$MC_PWD"
fi
unset MC_PWD
fi
rm -f "$MC_PWD_FILE"
unset MC_PWD_FILE
Run Code Online (Sandbox Code Playgroud)
%%函数名中的字符是什么意思?它们是在特定情况下调用的函数,还是允许我以与其他函数不同的方式调用它?
我正在使用 openSUSE 42.3 和 Bash 版本 4.3.42(1)-release (x86_64-suse-linux-gnu),如果这有什么不同的话。
What is the best practice for return many values from a bash function?
Function-script:
function mysqlquery {
local dbserver='localhost'
local dbuser='user'
local dbpass='pass'
local db='mydb'
mysql -h "$dbserver" -u "$dbuser" -p "$dbpass" --skip-column-names --raw -e "$*" "$db"
if [ $? -ne 0 ]; then
return 1
fi
}
Run Code Online (Sandbox Code Playgroud)
Source-script:
for XY in $(mysqlquery "select XY from ABC where DEF = 123" 2>/dev/null);do
dosomethingwith $XY
done
if mysqlquery "select XY from ABC where DEF = 123" 2>/dev/null; then
echo true …Run Code Online (Sandbox Code Playgroud) function ×10
bash ×9
shell ×3
alias ×2
shell-script ×2
bashrc ×1
disk-usage ×1
interactive ×1
mount ×1
parameter ×1
zsh ×1