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

他のBourne / POSIXシェルとは対照的に、GNUのBourne Again SHellに固有の質問。Unixシェル全般に関する質問については、代わりに/ shellタグを使用してください。

1
whileループの入力リダイレクト演算子の順序を逆にできないのはなぜですか?
Bashでは、入力リダイレクト演算子をコマンドの前に移動できます。 cat <<< "hello" # equivalent to <<< "hello" cat なぜ同じことをwhileループにできないのですか? while read -r line; do echo "$line"; done <<< "hello" # hello <<< "hello" while read -r line; do echo "$line"; done # -bash: syntax error near unexpected token `do' whileループにパイプできるので、少しわかりにくいです。私は何か間違ったことをしていますか、それとも単なる設計上の決定でしたか?

3
sh(bashではなく)が.bashrcで定義された関数について不平を言うのはなぜですか?
ターミナルセッションを開くと、これが表示されます。 sh: `read.json 'の関数定義のインポートエラー sh: `ts-project 'の関数定義のインポートエラー shは次のように見えるため、これらの関数が好きではありません。 read.json(){ :: } そして ts-project(){ :: } 本当の質問は-なぜshこれらのファイルに触れる/解釈するのですか?私はMacOSを使用していて、以前にこれを見たことがあります。それはとても謎です。これらのファイルを読み込むのはbashだけだと思います。 更新:bashとshは普通のことではありません。ターミナルにbashと入力すると、次のようになります。 alex$ bash beginning to load .bashrc finished loading .bashrc bash-3.2$ shターミナルに入力すると、これが得られます: alex$ sh sh: error importing function definition for `read.json' sh: error importing function definition for `ts-project' sh-3.2$

2
このbashパイプ構造を使用すると、なぜデータが失われたように見えるのですか?
私はそのようないくつかのプログラムを組み合わせようとしています(余分なインクルードは無視してください、これは進行中の重い作業です): pv -q -l -L 1 < input.csv | ./repeat <(nc "host" 1234) 繰り返しプログラムのソースは次のようになります。 #include <fcntl.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/epoll.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <iostream> #include <string> inline std::string readline(int fd, const size_t len, const char delim = '\n') { std::string …

2
Bashスクリプトは、起動した別のスクリプトのインスタンスのみを強制終了する必要があります
現在の状況では、特定のスクリプト「calling.sh」がバックグラウンドで別のスクリプト「called.sh」を起動し、他の操作を実行し、しばらくの間スリープし、その後「called.sh」をで終了しますpkill called.sh。これは正常に機能します。 次に、calling.shを起動する前でも後でも、他の端末からスタンドアロンのスクリプトとして「called.sh」を起動します。これらの独立したインスタンスは、「calling.sh」によって強制終了されるべきではありません。 どうすればこれを達成できますか?直観によると、呼び出し元のスクリプトは、その間に実行されている他の名前の由来から開始したプロセスを伝えることができるはずです。 変種として、「calling.sh」は「called.sh」へのシンボリックリンクである「called」を起動することもあります。これは上記の状況の管理を複雑にしますか?シンボリックリンクを使用するには、どのような注意と調整が必要ですか。
11 bash  process 

2
環境変数を設定するコマンドのプレフィックスとして変数を使用できないのはなぜですか?
通常、次のように接頭辞を付けることで、コマンドの環境変数を設定できます。 hello=hi bash -c 'echo $hello' また、変数を使用して、次のようなコマンド呼び出しの任意の部分を置き換えることができることも知っています。 $ cmd=bash $ $cmd -c "echo hi" # equivalent to bash -c "echo hi" 環境変数を設定するコマンドの前に変数を使用できないことを知って、私は非常に驚きました。テストケース: $ prefix=hello=hi $ echo $prefix # prints hello=hi $ $prefix bash -c 'echo $hello' hello=hi: command not found 変数を使用して環境変数を設定できないのはなぜですか?プレフィックス部分は特別な部分ですか?前にevalを使用することで機能させることができましたが、それでも理由がわかりません。bash 4.4を使用しています。

3
このスクリプトで開いているプロセスではなく、bashスクリプトの「Ctrl + c」をトラップします
私はbashスクリプトでインタラクティブなプログラムをしようとしました: my_program そして、「Ctrl + c」でそれを閉じたいと思います。しかし、それを実行すると、スクリプトも終了します。 私は知っています。 trap '' 2 my_program trap 2 しかし、この場合、my_programCtrl + cで閉じることができません。 プログラムでCtrl + cを許可し、実行中のスクリプトを閉じない方法はありますか? 編集:例を追加 #!/bin/bash my_program my_program2 Ctrl + cを使用して閉じるとmy_program、my_program2スクリプト全体が終了するため実行されません。
11 bash  trap 

2
GNU Bashのマニュアルに「time」がないのはなぜですか?
[fakename]$ help time time: time [-p] pipeline Report time consumed by pipeline's execution... このことからtime、Bashビルトインのようです。ただし、このページ(https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html#Shell-Builtin-Commands)で説明を見つけることができません。これはなぜですか?
11 bash  man  time 

1
Bashは引数リストを使用してパフォーマンスに問題がありますか?
bash 5.0で解決済み バックグラウンド 背景(および理解(およびこの質問への反対票を避けようとすることは魅力的であるように思われます))のために、この問題にたどり着いた経路を説明します(まあ、2か月後に思い出せる最善の方法です)。 Unicode文字のリストに対していくつかのシェルテストを実行していると仮定します。 printf "$(printf '\\U%x ' {33..200})" また、100万を超えるUnicode文字があり、そのうち20.000文字をテストしてもそれほど多くはないようです。 また、文字を位置引数として設定すると仮定します。 set -- $(printf "$(printf '\\U%x ' {33..20000})") 文字を各関数に渡して異なる方法で処理することを意図しています。そのため、関数はフォームtest1 "$@"または同様の形式にする必要があります。今、私はこれがいかに悪い考えであるかを理解しています。 ここで、各ソリューションの時間を測定する必要があると想定し(n = 1000)、どちらがより良いかを見つけます。このような状況では、次のような構造で終了します。 #!/bin/bash -- TIMEFORMAT='real: %R' # '%R %U %S' set -- $(printf "$(printf '\\U%x ' {33..20000})") n=1000 test1(){ echo "$1"; } >/dev/null test2(){ echo "$#"; } >/dev/null …
11 linux  bash  time 

2
ファイル記述子の寿命はどれくらいですか?
ここで説明するように、リダイレクトopen()はファイルへの書き込みに使用します。シェルで作成された内部(?)ファイル記述子があり、必要なときに使用されます。 内部記述子は、スクリプトの全期間またはシェルの存続期間に対して作成されますか?しばらくすると破壊されますか? 特に、シェル自体が組み込みの操作のために開くファイルのファイル記述子を意味します。各操作で記述子が作成され、ファイルが開かれますか?それらはどれくらいの期間保持されますか?例: #!/bin/bash >>x echo something ...do many other things not related to the file x >>x echo something more 最初の記述子インスタンスは、2番目の操作まで保持されますか? ターミナルで使用するシェルはどうですか?1つのセッションを数日間、場合によっては数週間開いたままにすることがあります。シェル組み込みで操作したすべてのファイルの記述子はまだ保持されますか?

8
if条件に基づくケースのフォールスルー
私はbashのケース条件内のif条件に基づいてフォールスルーが発生する方法を探しています。例えば: input="foo" VAR="1" case $input in foo) if [ $VAR = "1" ]; then # perform fallthrough else # do not perform fallthrough fi ;; *) echo "fallthrough worked!" ;; esac 上記のコードで、変数VARが1の場合、ケース条件にフォールスルーを実行させたいと思います。

2
wc <<<“ $ string”がprintf“ $ string”よりも1バイト長い長さを表示するのはなぜですか| トイレ?
偶然にも、wcそれがbashから入力を取得する方法に応じてカウントが異なることがわかりました。 $ s='hello' $ wc -m &lt;&lt;&lt;"$s" 6 $ wc -c &lt;&lt;&lt;"$s" 6 $ printf '%s' "$s" | wc -m 5 $ printf '%s' "$s" | wc -c 5 これは-私見が混乱する-どこかに文書化された行動ですか?wcここで何を数えますか?これは想定される改行ですか?

3
「/ bin / sh」が「/ bin / bash」を指しているときにシェルスクリプトを実行する
私はこの質問で次を読んだ: bashは--posixスイッチをサポートしているため、POSIXに準拠しています。また、shとして呼び出された場合、POSIXを模倣しようとします。 上記の引用は、それ/bin/shがを指すリンクであると仮定してい/bin/bashます。 しかし、「shとして呼び出された」という意味がよくわかりません。 「script.sh」と呼ばれる次のスクリプトがあるとします。 #!/bin/bash echo "Hello World" スクリプトが通常bashモードで実行されるのか、POSIXモードで実行されるのかを、次のそれぞれのケースで教えてください(実行中の端末で次のコマンドを実行したと想定していますbash)。 sh script.sh bash script.sh ./script.sh 「script.sh」と呼ばれる次のスクリプトがあるとしましょう(上記のスクリプトに似ていますが、シバンはありません)。 echo "Hello World" スクリプトが通常bashモードで実行されるのか、POSIXモードで実行されるのかを、次のそれぞれのケースで教えてください(実行中の端末で次のコマンドを実行したと想定していますbash)。 sh script2.sh bash script2.sh ./script2.sh
11 linux  bash  shell 

3
SSHリモートコマンドライン引数はどのように解析されますか
リモートsshコマンドへの引数を二重にエスケープする必要があるという質問と回答を見てきました。私の質問は次のとおりです。正確に、いつ、2番目の解析が行われますか? 次を実行すると: $ ssh otherhost pstree -a -p 次の出力が表示されます。 |-sshd,3736 | `-sshd,1102 | `-sshd,1109 | `-pstree,1112 -a -p リモートコマンド(pstree)の親プロセスはsshdであり、リモートコマンドへのコマンドライン引数を解析するシェルがないように見えるため、二重引用符またはエスケープが必要であるように見えません(しかし、それは間違いなくです)。代わりに最初にそこにsshし、ログインシェルを取得して実行するpstree -a -pと、出力に次のように表示されます。 ├─sshd,3736 │ └─sshd,3733 │ └─sshd,3735 │ └─bash,3737 │ └─pstree,4130 -a -p したがってbash、その場合にコマンドライン解析を実行するシェルがそこにあるのは明らかです。しかし、リモートコマンドを直接使用する場合、シェルがないように見えるので、なぜ二重引用符が必要なのでしょうか。
11 bash  shell  ssh  process  quoting 

3
シェルスクリプトでは、(1)バックグラウンドでコマンドを開始する方法(2)x秒待機する方法(3)そのコマンドの実行中に2番目のコマンドを実行する方法を教えてください。
これは私が起こる必要があるものです: バックグラウンドでプロセスAを開始 x秒待つ フォアグラウンドでプロセスBを開始 どうすれば待機を実現できますか? 「スリープ」はすべてを停止するように見えますが、実際にはプロセスAが完全に終了するのを「待機」したくありません。時間ベースのループをいくつか見てきましたが、もっときれいなものがあるかどうか疑問に思っています。

3
空のJSON中括弧をデフォルト値としてエコーするにはどうすればよいですか?
{}envvarがない場合、空のJSON をエコーすることができないようです。}設定されている場合は、出力の末尾が表示されるか、エスケープが表示されます。 bash-3.2$ unset X bash-3.2$ echo "${X:-{}}" {} bash-3.2$ X=y bash-3.2$ echo "${X:-{}}" y} bash-3.2$ echo "${X:-{\}}" y bash-3.2$ unset X bash-3.2$ echo "${X:-{\}}" {\} bash-3.2$ echo "${X:-'{}'}" '{}' bash-3.2$ X=z bash-3.2$ echo "${X:-'{}'}" z どうすれば正しくエスケープできますか?
11 bash  variable 

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