如何创建文件并使其可执行,而无需输入两次文件名?

qq4*_*qq4 1 bash arguments one-liner

我希望能够一次性列出一个文件,而不必chmod +x像. 有没有办法一次性做到这一点?以下是一些描述预期行为的伪代码解释:touchtouch foo && chmod +x foo

chmod <placeholder> && touch <placeholder> <-redirect- "filename"
Run Code Online (Sandbox Code Playgroud)

我厌倦了输入一次性命令,然后返回并对不同文件执行几次相同的命令,我必须在每个命令中编辑文件名两次。在我的伪代码示例中,我只需返回到之前输入的命令并仅编辑末尾的文件名字符串。

我努力了,

touch "$(echo foo && chmod +x !$)"
Run Code Online (Sandbox Code Playgroud)

但文件名既不在字符串的末尾,而且它似乎不起作用,因为最后!$一个参数是传递给 before 的命令的参数touch

mar*_*rkp 5

如果您所做的只是发行touch / chmod货币对,那么一个简单的函数就足够了:

touchx() { touch "$1"; chmod +x "$1"; }
Run Code Online (Sandbox Code Playgroud)

进行试驾:

$ touchx myscript.sh
$ ls -l myscript.sh
-rwxrwx--x+ 1 username None 0 Mar 29 14:37 myscript.sh
Run Code Online (Sandbox Code Playgroud)

另一方面,如果目标是支持一系列事先未知的命令集,则另一个函数可能会派上用场:

multicmd() {
    fname="$1"
    shift
    for cmd in "$@"
    do
        echo "##### $cmd $fname"
        $cmd "$fname"
    done
}

# or as a one-liner:

multicmd() { fname="$1"; shift; for cmd in "$@"; do echo "##### $cmd $fname"; $cmd "$fname"; done; }
Run Code Online (Sandbox Code Playgroud)

试驾

$ multicmd myscript.sh rm touch 'chmod +x' 'file' 'ls -l'
##### rm myscript.sh
##### touch myscript.sh
##### chmod +x myscript.sh
##### file myscript.sh
myscript.sh: empty
##### ls -l myscript.sh
-rwxrwx--x+ 1 username None 0 Mar 29 14:54 myscript.sh
Run Code Online (Sandbox Code Playgroud)