Command to append line to a text file without opening an editor

Assuming i have a line that i want to add to a file without opening an editor.

How could i append this line

alias list='ls -cl --group-directories-first'

to this file

config.fish

3 Answers

You can append a line of text to a file by using the >> operator:

echo "hello world" >> my_file.txt

or in your case

echo "alias list='ls -cl --group-directories-first'" >> config.fish

Please take note of the different types of quotes.

8

Adding to Stefano's answer, you can also use cat:

  • Using a heredoc:

    $ cat >> config.fish <<'EOF'
    > alias list='ls -cl --group-directories-first'
    > EOF

    <<'EOF' means "take the following as input, until you reach a line that is just EOF". The quotes mean to take the input literally.

  • Or inputting the line on stdin:

    $ cat >> config.fish

    Then paste or type in the line, press Enter to go to a new line, then press Ctrl+D to mark the end.

3

There's plenty of methods of appending to file without opening text editors, particularly via multiple available text processing utilities in Ubuntu. In general, anything that allows us to perform open() syscall with O_APPEND flag added, can be used to append to a file.

  • GNU version of dd utility can append data to file with conv=notrunc oflag=append

    printf "\nalias list='ls -cl --group-directories-first'\n" | dd conv=notrunc oflag=append bs=1 of=config.fish

    Portably we could use something like this on the right side of pipeline:

    dd conv=notrunc seek=$(wc -c < testFile.txt) bs=1 of=testFile.txt

    Note the use of bs=1 , which is to prevent short reads from pipeline

  • The tee command can be used when you need to append to file and send it to stdout or to next command in pipeline

    tee -a config.fish <<< "alias list='ls -cl --group-directories-first'"
  • awk has append operator >> which is also portable and defined by POSIX specifications

    awk 'BEGIN{ printf "alias list=\x27ls -cl --group-directories-first\x27\n" >> "config.fish" }'
  • We can combine sed's flag $ to match the last line with a for appending and -i for in-place editing.

    sed -i '$a alias list='"'"'ls -cl --group-directories-first'"'" config.fish
  • We could even implement something like dd in Python 3:

 #!/usr/bin/env python3 # read bytes from stdin, append to specified file import sys with open(sys.argv[1],'ab') as f: f.write(sys.stdin.buffer.read())

See also:

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like