this post was submitted on 03 May 2024
26 points (86.1% liked)

Linux

48256 readers
412 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

I am tired of creating a file with nano, saving it and then making it executable. Is there a command that makes it in one step?

all 18 comments
sorted by: hot top controversial new old
[–] cyborganism@lemmy.ca 71 points 6 months ago (1 children)

You mean like

touch file && chmod +x file ?

[–] MrAlternateTape@lemm.ee 17 points 6 months ago

Wrap it up folks, we're done here.

[–] CameronDev@programming.dev 38 points 6 months ago* (last edited 6 months ago) (1 children)

Write an alias/function to do it and add to your bashrc.

function nanox() {
    nano "$1"
    chmod +x "$1"
}
[–] psmgx@lemmy.world 0 points 6 months ago

This is the way.

[–] NegativeLookBehind@lemmy.world 17 points 6 months ago* (last edited 6 months ago) (2 children)

You want the install command.

install

At least, I think this will do it. I haven’t used it in a while.

[–] kureta@lemmy.ml 6 points 6 months ago (1 children)

touch file && chmod +x file is good but this here is the one true command for the purpose.

[–] 2xsaiko@discuss.tchncs.de 2 points 6 months ago (1 children)

install -m755 /dev/null target was the first thing I thought of. I would never use this but it is a single command.

[–] NegativeLookBehind@lemmy.world 1 points 6 months ago (1 children)

Why would you never use it?

[–] 2xsaiko@discuss.tchncs.de 1 points 6 months ago

I'm going to write (at least part of) the script first anyway, and then I can just use chmod +x after the file is saved which is shorter.

[–] kayaven@lemmy.world 13 points 6 months ago

You could define a function that takes a parameter, which touches a file with the parameters value, chmods it and then opens it with nano?

create_exec() {
    touch "$1"
    chmod +x "$1"
    nano "$1"
}

Then you could type create_exec file.sh and it would do the rest for you.

[–] sneakyninjapants@sh.itjust.works 12 points 6 months ago

Here's one I have saved in my shell aliases.

nscript() {
    local name="${1:-nscript-$(printf '%s' $(echo "$RANDOM" | md5sum) | cut -c 1-10)}"
    echo -e "#!/usr/bin/env bash\n#set -Eeuxo pipefail\nset -e" > ./"$name".sh && chmod +x ./"$name".sh && hx ./"$name".sh
}
alias nsh='nscript'

Admittedly much more complicated than necessary, but it's pretty full featured. first line constructs a filename for the new script from a generated 10 character random hash and prepends "nscript" and a user provided name.

The second line writes out the shebang and a few oft used bash flags, makes the file executable and opens in in my editor (Helix in my case).

The third line is just a shortened alias for the function.

[–] eruchitanda@lemmy.world 7 points 6 months ago (2 children)

Use && to use multiple commands one after the other, don't use ;.

[–] eruchitanda@lemmy.world 18 points 6 months ago (1 children)

- && means execute if the command before ended successfully

- || means execute if the commnad before failed

- ; just means execute the command - no matter if succeeded or failed

[–] ArcaneSlime@lemmy.dbzer0.com 1 points 6 months ago

My dude, thanks for this. I've been using && for a long time now but never knew the rest, I'm still pretty new to linux comparatively.

[–] bjoern_tantau@swg-empire.de 3 points 6 months ago

You could append the chmod command with && but that's probably not what you wanted.