タグ付けされた質問 「shell-script」

シェルスクリプト、シェルによって解釈される実行可能ファイル(bash、zshなど)に関する質問。

9
「#!/ path / to / NAME」の代わりに「#!/ usr / bin / env NAME」をシバンとして使用する方が良いのはなぜですか?
#!/path/to/NAME他の人(同じツールNAMEを使用)がshebang を持っている間に、他の人から取得したスクリプトの中にはshebang を持っていることに気付き#!/usr/bin/env NAMEます。 両方とも正常に動作するようです。チュートリアル(Pythonなど)では、後者の方が優れているという提案があるようです。しかし、なぜそうなのか、私にはよくわかりません。 後者のシバンを使用するには、NAMEがPATHに含まれている必要がありますが、最初のシバンにはこの制限がありません。 また、(私には)NAMEの場所を正確に指定するため、最初の方がより良いシバンになるようです。そのため、この場合、NAMEのバージョンが複数ある場合(たとえば、/ usr / bin / NAME、/ usr / local / bin / NAME)、最初のケースはどちらを使用するかを指定します。 私の質問は、なぜ最初のシバンが2番目のシバンよりも好まれるのかということです。

3
スクリプトでの変数の割り当てに「$ {a:-b}」を使用する
私は他の人が書いたいくつかのスクリプト(特にRed Hat)を見てきましたが、それらの変数の多くは次の表記法を使用して割り当てられる VARIABLE1="${VARIABLE1:-some_val}" か、他の変数を展開します VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}" 値を直接宣言するだけでなく、この表記法を使用する意味は何ですか(例:)VARIABLE1=some_val? この表記法や、防止される可能性のあるエラーには利点がありますか? :-このコンテキストで特定の意味を持っていますか?

14
Bashでは、いつエイリアスを作成し、いつスクリプトを作成し、いつ関数を作成するのですか?
この質問をするのに、ほぼ10年間のLinuxの使用が必要でした。それはすべて試行錯誤とランダムな深夜インターネットサーフィンでした。 しかし、人々はこのために10年を必要としないはずです。Linuxを使い始めたばかりの場合、知りたいのは、エイリアスを作成するタイミング、スクリプトを作成するタイミング、関数を作成するタイミングです。 エイリアスに関しては、引数をとらない非常に簡単な操作にエイリアスを使用します。 alias houston='cd /home/username/.scripts/' それは明らかです。しかし、これを行う人もいます: alias command="bash bashscriptname" (そして.bashrcファイルに追加します) それをする正当な理由はありますか?私は一生懸命努力していますが、それをやりたいと思う状況はまったく考えられません。それで、それが違いを生むエッジケースがあるならば、以下に答えてください。 それが、私が自分のPATHとchmod +xそれに何かを入れる場所だからです。 次のトピックに進みます。例えば、私は、隠しフォルダ(追加.scripts/ちょうど私に行を追加することで、私のPATHにホームディレクトリ内の).bashrc(PATH=$PATH:/home/username/.scripts/)ので、そこに実行可能なものは自動的に自動的に補完します。 必要な場合。 私は本当にそれを必要としませんが、私は?Pythonのようなシェルではない言語に対してのみ使用します。 それがシェルの場合、まったく同じ内部に関数を書くことができます.bashrc: funcname () { somecommand -someARGS "$@" } 私が述べたように、私は試行錯誤を通してこれの多くを見つけました。そして、私のコンピューターが死んだときだけ、機能の美しさを本当に見ました。そして、彼らが使用していないとき、私は周りの人々のコンピューターを使用せざるを得ませんでした。 スクリプトのディレクトリ全体をコンピューターからコンピューターに移動する代わりに、他のすべての.bashrcを自分のものに置き換えるだけになりました。 しかし、私は何かを見逃しましたか? それでは、エイリアスを作成するタイミング、スクリプトを作成するタイミング、関数を作成するタイミングについて、初心者のLinuxユーザーに何を伝えますか? 明らかでない場合、これに答える人々は3つのオプションすべてを利用すると仮定しています。エイリアスのみを使用するか、スクリプトのみを使用するか、関数のみを使用する場合、またはエイリアスとスクリプト、またはエイリアスと関数、またはスクリプトと関数のみを使用する場合、この質問は実際には対象ではありません。

5
シェルスクリプトが空白またはその他の特殊文字で停止するのはなぜですか?
または、堅牢なファイル名処理およびシェルスクリプトで渡すその他の文字列の入門ガイド。 ほとんどの場合、うまく機能するシェルスクリプトを作成しました。ただし、一部の入力(たとえば、一部のファイル名)で停止します。 次のような問題が発生しました。 スペースを含むファイル名を持っていて、hello worldそれは2つの別個のファイルhelloとworld。 2つの連続したスペースを持つ入力行があり、入力で1つに縮小しました。 入力行から先頭と末尾の空白が消えます。 入力に文字の1つが含まれている場合、\[*?実際にはファイルの名前であるテキストに置き換えられることがあります。 入力にアポストロフィ'(または二重引用符")が含まれており、その時点以降は状況がおかしくなりました。 入力にバックスラッシュがあります(または、Cygwinを使用していて、ファイル名の一部にWindowsスタイルの\区切り文字があります)。 何が起こっており、どうすれば修正できますか?

23
シェルスクリプトで外部IPアドレスを取得するにはどうすればよいですか?
シェルスクリプトから外部IPアドレスを見つける必要があります。現時点では、この関数を使用しています。 myip () { lwp-request -o text checkip.dyndns.org | awk '{ print $NF }' } しかし、それが依存perl-libwww、perl-html-format、perl-html-treeインストールされています。外部IPを取得できる他の方法は何ですか?
273 linux  shell-script  ip 

3
shスクリプトでsedを使用する場合、どの文字をエスケープする必要がありますか?
次のスクリプトを使用します。 #!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file] sh(dashここ)でこれを実行しようとすると、エスケープする必要がある括弧のために失敗します。しかし、私はしません(オクテットの間、またはバックスラッシュ自体をエスケープする必要があります\sか\1)。ここでのルールは何ですか?いつ使用する必要があります{...}か[...]?私がしていることと逃げる必要がないことのリストはありますか?


8
変数が空であるか、スペースのみが含まれているかどうかをテストするにはどうすればよいですか?
次のbash構文は、param空でないかどうかを検証します。 [[ ! -z $param ]] 例えば: param="" [[ ! -z $param ]] && echo "I am not zero" 出力なしとその罰金。 ときしかし、param1つ(またはそれ以上)のスペース文字を除いて空で、そして場合は異なります。 param=" " # one space [[ ! -z $param ]] && echo "I am not zero" 「I am not zero」が出力されます。 スペース文字のみを含む変数を空と見なすようにテストを変更するにはどうすればよいですか?

3
ファイルの内容を空にします
ファイルからすべてのエントリを削除する3つの方法を知っています。 彼らです >filename touch filename filename < /dev/null これら3つのうち>filename、キーストロークの回数が最も少ないので、私は最も悪用しています。 ただし、大きなログファイルと小さなファイルに関して、3つのうちのどれが最も効率的か(より効率的な方法がある場合)を知りたいと思います。 また、3つのコードはどのように動作し、コンテンツを削除しますか?

3
bash / POSIXシェルで変数を引用するのを忘れた場合のセキュリティへの影響
しばらくunix.stackexchange.comをフォローしている場合はecho $var、Bourne / POSIXシェル(zshは例外)のリストコンテキスト(のように)で変数を引用符で囲まないでおくと、非常に特別な意味があり、正当な理由がない限り、実行しないでください。 ここでいくつかのQ&Aで詳細に議論されています(例:シェルスクリプトが空白または他の特殊文字でチョークするのはなぜですか?、二重引用符が必要なのはいつですか?、シェル変数の展開とグロブと分割の効果、引用符付き引用符なしの文字列展開) これは、70年代後半のBourneシェルの最初のリリース以降のケースであり、Kornシェル(David Kornの最大の後悔の 1つ(質問#7))によって変更されていないかbash、Kornシェルをほとんどコピーしたものです。 POSIX / Unixでどのように指定されているか。 現在、ここにはまだ多くの回答があり、変数が引用されていない公開されているシェルコードもときどき公開されています。あなたは今までに人々が学んだと思っていただろう。 私の経験では、変数を引用するのを省略した人が主に3種類あります。 初心者。確かにそれは完全に直感的でない構文であるため、それらは言い訳することができます。そして、彼らを教育することは、このサイトでの私たちの役割です。 忘れっぽい人。 繰り返しハンマーを打っても納得しない人、Bourneシェルの作者が私たちのすべての変数を引用するつもりはなかったと思う人。 この種の行動に関連するリスクを明らかにすれば、彼らを説得できるかもしれません。 変数の引用を忘れた場合に起こりうる最悪の事態は何ですか。それは本当にそれが悪いですか? ここでどのような脆弱性について話しているのですか? どのような状況で問題になりますか?


12
複数のファイルの拡張子を変更するにはどうすればよいですか?
ファイル拡張子をから*.txtに変更したいと思います*.text。basenameコマンドを使用してみましたが、複数のファイルを変更するのに問題があります。 これが私のコードです: files=`ls -1 *.txt` for x in $files do mv $x "`basename $files .txt`.text" done 私はこのエラーを受け取っています: basename: too many arguments Try basename --help' for more information



10
いくつかの出力の各行から先頭と末尾の空白をトリミングするにはどうすればよいですか?
出力の各行から先頭と末尾のスペースとタブをすべて削除したいと思います。 trim出力をパイプすることができるような簡単なツールはありますか? サンプルファイル: test space at back test space at front TAB at end TAB at front sequence of some space in the middle some empty lines with differing TABS and spaces: test space at both ends

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.