From 7caff6e462fd096c8ad00ec25ee602c835141344 Mon Sep 17 00:00:00 2001 From: DarkSun Date: Thu, 13 Aug 2020 05:01:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=89=E9=A2=98[tech]:=2020200812=20Why=20I?= =?UTF-8?q?=20still=20love=20tcsh=20after=20all=20these=20years?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sources/tech/20200812 Why I still love tcsh after all these years.md --- ...I still love tcsh after all these years.md | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 sources/tech/20200812 Why I still love tcsh after all these years.md diff --git a/sources/tech/20200812 Why I still love tcsh after all these years.md b/sources/tech/20200812 Why I still love tcsh after all these years.md new file mode 100644 index 0000000000..a11347956a --- /dev/null +++ b/sources/tech/20200812 Why I still love tcsh after all these years.md @@ -0,0 +1,152 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Why I still love tcsh after all these years) +[#]: via: (https://opensource.com/article/20/8/tcsh) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Why I still love tcsh after all these years +====== +Bash may be more popular, but tcsh has advantages that make it more +appealing in certain cases. +![Person programming on a laptop on a building][1] + +I consider myself a happy [Bash][2] user. However, when I started exploring Unix, it was on a proprietary Unix system that provided [tcsh][3] by default, so my earliest shell experiences were on a modern version of the C shell (csh). That turned out to be a fortunate accident because tcsh was also the shell of choice at the film studio where I worked later in my career. + +To this day, there are several tasks I associate with tcsh, even though there's no logical correlation there. I still use tcsh on at least one system, if only to stay in practice. I also keep it installed on all my systems to maintain compatibility with my own tcsh scripts and to ensure I can launch it when I need to write a script I prefer to have in tcsh. + +### The difference between C shell and Bash + +Tcsh is the modern continuation of csh. When the C shell was released way back in 1978, users were excited over its C-like syntax. C was a new programming language at the time, and more importantly, it was what Unix was written in, so most Unix users were more comfortable with C than an arbitrary scripting language. For instance, in Bash, this `if` loop makes a "secret" call to the `test` binary to evaluate the conditional statement (the part in brackets): + + +``` +v=1 + +if [ $v -gt 0 ] +  then +  echo "verbose" +fi +``` + +Here's the same statement in csh or tcsh, without an external call to `test` because the conditional statement (the code in parentheses) uses csh's built-in evaluation: + + +``` +set v=1 + +if ($v > 1) then +  echo "verbose" +endif +``` + +This demonstrates a few things, both good and bad. For instance, it's natural for a C programmer to type a conditional in parentheses, and it's desirable from a programmer's perspective to have math evaluation built into the executable. On the other hand, the `if` loop syntax has more in common with Lua than C, which uses braces as delimiters: + + +``` +// this does not work in Csh +if ( v>1 ) { +        [printf][4]("verbose"); +} +``` + +In a way, this nicely sums up csh: it's clean, efficient, and familiar for some, but quirky and inconsistent. + +So why use it? + +### Tcsh for precision + +I write more C++ and [Java][5] than C code, so my interest in tcsh shares little with its historical claim to fame. However, I enjoy [Lua][6], and in a way, I think of tcsh and other shells like I think of Lua and Python or even Markdown and [Docbook][7]. Both shells have merit, and it's easy to point to the one that's more popular, but there's strict clarity to the other. In fact, I feel tcsh has a precision that many other shells lack. + +### Variables + +You don't get the luxury of typed variables in shells, but with tcsh, you can at least declare them with a keyword. Strangely, there are several keywords you can use for the task, but the one I settled on was `set`: + + +``` +> set var=foo +> echo $var +foo +``` + +You can expand variables by typing the name of the variable (`var` in this example) and then pressing **Ctrl+X** followed by the **$** (dollar) key. The example above sets `var` to `foo`. + +As with many other shells, you can list all set variables using `set` alone with no arguments: + + +``` +> set +term    xterm +tty     pts/2 +uid     1000 +user    seth +var     foo +[...] +``` + +You can unset a variable using the `unset` command: + + +``` +> unset var +> set | grep var +> +``` + +### Missing features is a feature + +Maybe you've seen lines like this in a script: + + +``` +var=GitLab +${var,,} +``` + +The second line is a built-in function to transform the contents of `var` into lowercase. + +While extra functions like these are infinitely useful, I sometimes feel they're an invitation to obfuscation. Shell scripting is like the HTML of programming; it's one of the few serious languages you can teach yourself just by reading other people's code. That's not necessarily a great reason to give up useful functions, but it's the reason I try to avoid some of the cryptic shorthand popular in various languages. When writing in tcsh, I don't have the option to use as much shorthand, so complex string operations must be performed with basic Unix tools rather than by built-in shortcuts. I believe it results in code that's easier to read, and that makes a big difference to future contributors—and to future, forgetful _me_. + +### Built-in math + +One of the things I love about tcsh is its built-in **@** math shortcut. Like most self-taught Unix users, I stumbled upon [bc][8], and I've regretted it ever since. Through no fault of its own, bc is often taught to users as a command-line calculator when it's actually better suited as a calculation _language_. Workarounds include an amazing 300-line [calculator in pure Bash][9], or the **let** command in Bash, or the **@** command in tcsh. + + +``` +> @ n = ( 1 + 1 / 2 ) +> echo $n +1 +``` + +For very complex math, it may be worth [learning bc][10] or a good [Python mathematics library][11]. + +### All the essentials + +For me, tcsh strikes a perfect balance between stark simplicity and essential features. It's not a shell for all users, or even for all purposes, but if you're looking to simplify your view of your text-based world, tcsh might provide an interesting alternative. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/tcsh + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_code_programming_laptop.jpg?itok=ormv35tV (Person programming on a laptop on a building) +[2]: https://opensource.com/resources/what-bash +[3]: https://github.com/tcsh-org/tcsh +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[5]: https://opensource.com/resources/java +[6]: https://opensource.com/article/20/2/lua-cheat-sheet +[7]: https://opensource.com/article/17/9/docbook +[8]: https://www.gnu.org/software/bc/ +[9]: https://raw.githubusercontent.com/bluebat/.bash/master/bashbc.sh +[10]: https://opensource.com/article/20/7/bc +[11]: https://opensource.com/alternatives/matlab