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

シェルは、Unixのコマンドラインインターフェイスです。シェルにインタラクティブにコマンドを入力するか、スクリプトを記述してタスクを自動化できます。/ bin / shおよび最も互換性のあるシェル(ash、bash、ksh、zshなど)に適用される質問には、このタグを使用します。エラーのあるシェルスクリプトについては、ここに投稿する前にhttp://shellcheck.netで確認してください。

2
範囲を使用したtrの奇妙な動作
trを使用するときに奇妙な動作をする特定のサーバーがあります。以下は、稼働中のサーバーの例です。 -bash-3.2$ echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z] 1234567890 -bash-3.2$ それは私には完全に理にかなっています。 ただし、これは「特別な」サーバーからのものです。 [root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z] abcdefghijklmnpqrstuvwxyz1234567890 ご覧のように、すべての小文字の削除は失敗します。しかし、それは文字「o」を削除しました 興味深いのは、次の2つの例ですが、これらはまったく意味がありません。 [root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-n] opqrstuvwxyz1234567890 [root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-o] abcdefghijklmnpqrstuvwxyz1234567890 [root@host~]# (ここでも、最後の例では「o」が削除されています) ここで何が起こっているのか誰か誰か知っていますか?私が使用している他のLinuxボックスでは再現できません。



2
割り当ては、コマンド置換がある場合を除いて、終了ステータスを持つコマンドに似ていますか?
次の例とそれらのPOSIXシェルでの出力を参照してください。 false;echo $?またはfalse || echo 1:1 false;foo="bar";echo $?またはfoo="bar" && echo 0:0 foo=$(false);echo $?またはfoo=$(false) || echo 1:1 foo=$(true);echo $?またはfoo=$(true) && echo 0:0 /programming/6834487/what-is-the-variable-in-shell-scriptingの最高投票の回答で述べたように: $? 最後に実行されたコマンドの戻り値を見つけるために使用されます。 これはおそらくこの場合少し誤解を招く可能性があるので、そのスレッドからの投稿でも引用されているPOSIX定義を取得しましょう。 ?最新のパイプラインの10進数の終了ステータスに展開します(パイプラインを参照)。 したがって、割り当て自体はゼロの終了値を持つコマンド(またはパイプラインパーツ)としてカウントされているように見えますが、割り当ての右側の前に適用されます(たとえば、ここでの例ではコマンド置換呼び出し)。 この振る舞いが実用的な見地からどのように意味を成すかはわかりますが、割り当て自体がその順序でカウントされることは、私には幾分珍しいようです。多分それが私にとって奇妙な理由をより明確にするために、割り当てが関数であったと仮定しましょう: ASSIGNMENT( VARIABLE, VALUE ) そしてfoo="bar"だろう ASSIGNMENT( "foo", "bar" ) のfoo=$(false)ようなものになります ASSIGNMENT( "foo", EXECUTE( "false" ) ) そのことを意味するEXECUTE実行が最初と後にのみ ASSIGNMENT実行されますが、それはまだだEXECUTEここで問題のステータス。 私の評価は正しいですか、それとも何かを誤解/不足していますか?これらは、私がこの振る舞いを「奇妙な」ものと見なす正しい理由ですか?


2
一時停止後、whileループが停止するのはなぜですか?
bashを使用してwhileループを一時停止すると、ループが再開後に停止するのはなぜですか?以下の短い例。 $ while true; do echo .; sleep 1; done . . ^Z [1]+ Stopped sleep 1 $ fg sleep 1 $ 私はシグナルに精通しており、これはここではbashの自然な動作であると推測していますが、この特定の方法で動作する理由をよりよく理解したいと思います。

2
現在のプロセスをそのコプロセス/子で置き換えます
P「Hello」を受け取り、「Why?」を出力することを期待するプログラムがあります。機能を提供する前に。この機能は、「こんにちは」との会話を開始することが礼儀であることを認識していない他のプログラムによって使用されます。したがって、次のように機能するラッパーを記述したいと思いPます(zsh構文)。 coproc P print -p Hello # Send Hello to P read -pr line # Read what P has to say [[ "$line" = "Why?" ]] && Replace current process with the coprocess. echo Could not get P's attention. 使用するcatかddにReplace...一部(のようなものはcat <&p &; exec cat >&p)不要なバッファリングになります。私のオプションは何ですか?
10 shell  scripting  process  zsh 

5
角括弧グロビングにおける大文字と小文字の区別
通常、bashグロビングでは大文字と小文字が区別されます。 $ echo c* casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py $ echo C* CarePackage.md ChocRippleCake.md Clips 角括弧を使用しても、これは変更されないようです。 $ echo [c]* casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py $ echo [C]* CarePackage.md ChocRippleCake.md Clips ハイフンが使用されている場合でも、変更されません。 $ echo [c-c]* casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py …
10 bash  shell  wildcards  locale 


4
「set」というプログラムが実行されないのはなぜですか?
次のような簡単なCプログラムを作成しました。 int main(int argc, char *argv[]) { if (argc != 5) { fputs("Not enough arguments!\n", stderr); exit(EXIT_FAILURE); } そして、私は自分のPATHをetc / bash.bashrcで次のように変更しています: PATH=.:$PATH このプログラムをset.cとして保存し、コンパイルしています。 gcc -o set set.c フォルダ内 ~/Programming/so しかし、電話すると set 2 3 何も起こりません。表示されるテキストはありません。 呼び出す ./set 2 3 期待される結果を与える 以前にPATHに問題があったことはありません。 which set を返します./set。したがって、PATHが正しいようです。何が起こっているのですか?

3
X秒ごとにコマンドを実行する
コマンドを10秒ごとに実行し、それをバックグラウンドで実行したい(それによってwatch?を削除したい)。すべての回答は次のようなものを示していますが、これは常に11〜14秒実行されます。どうすればこれを達成できますか? while true; do # perform command that takes between 1 and 4 seconds sleep 10 done


2
すべての出力をPOSIXシェルの「ロガー」に送信する方法は?
私はで別々に標準出力と標準エラーを記録したいと思います.xprofile使用しますlogger。バッシュでは、次のようになると思います。 exec 1> >(logger --priority user.notice --tag $(basename $0)) \ 2> >(logger --priority user.error --tag $(basename $0)) POSIX /bin/sh互換の方法でそれをどのように行うのですか?
10 shell  pipe  posix 

1
グロブパターンから定義された変数によるバッシュ置換
以下の例は問題を説明しています。FILENAME置換を使用したときに、エコーされてパターンとして認識されたときに正しく印刷されるのはなぜですか? #!/bin/bash FILEPATH_WITH_GLOB="/home/user/file_*" FILENAME=$(basename "$FILEPATH_WITH_GLOB") echo $FILENAME #file_1234 echo ${FILENAME:1:5} #ile_* <---why is this not ile_1

6
名前にスペースが含まれているファイルを削除する
名前にスペースが含まれているすべてのファイルを削除しようとしています。次のコマンドを使用しています。しかし、それは私にエラーを与えています コマンド: ls | egrep '. ' | xargs rm ls | egrep '. 'コマンドのみを使用している場合、ファイル名にスペースを含むすべてのファイル名が表示されます。しかし、出力をrmに渡そうとすると、すべてのスペース(先頭または末尾)が削除されます。だから私のコマンドは正しく実行されていません。 名前に少なくとも1つのスペースがあるファイルを削除する方法についてのポインタはありますか?
10 shell  quoting  rm  xargs 

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