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

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


4
フォルダーをループしてファイルを一覧表示する
「sample」という名前のフォルダーがあり、その中に3つのファイルがあります。サンプルフォルダー内のこれらのファイルを読み取り、curlを使用してHTTPサイトに投稿するシェルスクリプトを書きたいのですが。 フォルダ内のファイルを一覧表示するために、次のように記述しました。 for dir in sample/*; do echo $dir; done しかし、それは私に次の出力を与えます: sample/log sample/clk sample/demo その中に親フォルダを付けています。次のように出力したい(親フォルダー名なし) log clk demo どうすればよいですか?

4
SIGINTなどをトラップするときに終了コードを保持しますか?
trapたとえばhttp://linuxcommand.org/wss0160.php#trapで説明されているように使用してctrl-c(または類似のもの)をキャッチし、終了する前にクリーンアップすると、返される終了コードが変更されます。 これはおそらく現実の世界では違いはありません(たとえば、終了コードは移植可能ではなく、その上に、プロセスが終了したときのデフォルトの終了コードで説明されているように常に明確であるとは限らないためです)。それでも、本当にそれを防ぎ、代わりに中断されたスクリプトのデフォルトのエラーコードを返す方法はありませんか? 例(bashですが、私の質問はbash固有のものと見なすべきではありません): #!/bin/bash trap 'echo EXIT;' EXIT read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _ trap 'echo SIGINT; exit 1;' INT read -p 'If you ctrl-c me now my return code will be 1. ' _ 出力: $ ./test.sh …

5
シェルスクリプトでプログラムのバージョンを比較する方法は?
gccバージョンを比較して、システムに最小バージョンがインストールされているかどうかを確認するとします。 gccバージョンを確認するために、以下を実行しました gcc --version | head -n1 | cut -d" " -f4 出力は 4.8.5 だから、私はifこのバージョンを他の値と照合する簡単なステートメントを書きました if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then echo "Less than 5.0.0" else echo "Greater than 5.0.0" fi しかし、それはエラーを投げます: [: integer expression expected: 4.8.5 比較に文字列を使用していて、-ltrequiresに整数が必要であるという私の間違いを理解しました。では、バージョンを比較する他の方法はありますか?

7
sedが置換文字列を解釈しないようにする方法はありますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 sedを使用してキーワードを文字列に置き換える場合、sedは置換文字列を解釈しようとします。置換文字列に「/」文字など、sedが特殊と見なす文字が含まれている場合、当然、置換文字列にsedに動作方法を指示する文字を含めることを意図していない限り、失敗します。 例: VAR="hi/" sed "s/KEYWORD/$VAR/g" somefile 特殊文字の置換文字列を解釈しないようにsedに指示する方法はありますか?内容が何であっても、ファイルのキーワードを変数の内容に置き換えることができるようにしたいだけです。
14 bash  shell-script  sed 

1
「test」という名前の実行可能ファイルは$ PATHにありますが、実行されません
$ HOME / binにファイルがあります(尋ねる前に、はい、私のtestパスにあります)。ファイルへのフルパスで実行すると問題なく実行できることを確認しました。ただし、この方法で実行しないと、本当に奇妙な問題が発生します。testターミナルで実行すると、何もせずにすぐに戻ります。これは、いくつかの理由でファイルを見つけることの問題ではないことを知っています。 エラーメッセージはありません。通常、ファイルが見つからない、または実行できない場合、その旨を示すメッセージが出力されます。 実行してwhich testも、正しいファイルパスが返されます。 おそらく最も奇妙なのは、スクリプトが実行されstraceたときに正常に動作することです。私はstrace何が起こっているのかを理解できるかどうかを試してみましたが、で実行するとstrace、問題なく0で動作しました。


4
シェルスクリプトを使用して変数のコンテンツを印刷することはできますか?(間接参照)
次の変数を宣言したとしましょう。 $ var='$test' $ test="my string" コンテンツを印刷すると、次のように表示されます。 $ echo $var $test $ echo $test my string のコンテンツ$var(のコンテンツ)を印刷する方法を見つけたい$testです。だから私は次のことをしようとしました: $ echo $(echo $var) $test しかし、ここで結果はそうでは$testありません"my string"... bashを使用して変数の内容の内容を印刷することは可能ですか?

3
調達する前にファイルの存在を確認する理由
ファイルを入手しようとすると、ファイルが存在しないというエラーが表示されないので、何を修正すればよいかわかりますか? たとえば、nvmはこれをプロファイル/ rcに追加することをお勧めします。 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 上記を使用nvm.shすると、存在しない場合は「サイレントエラー」が発生します。しかし、試してみる. "$NVM_DIR/nvm.sh"と、出力はになりますFILE_PATH: No such file or directory。

3
「ps ax」が「#!」ヘッダーなしで実行中のbashスクリプトを見つけられないのはなぜですか?
このスクリプトを実行すると、殺されるまで実行することを意図しています... # foo.sh while true; do sleep 1; done ...を使用して見つけることができませんps ax: >./foo.sh // In a separate shell: >ps ax | grep foo.sh 21110 pts/3 S+ 0:00 grep --color=auto foo.sh ...ただし#!、スクリプトに共通の " "ヘッダーを追加するだけの場合... #! /usr/bin/bash # foo.sh while true; do sleep 1; done ...その後、同じpsコマンドでスクリプトが検索可能になります... >./foo.sh // In a separate shell: >ps …

2
UbuntuでshにBashを使用する方法
rpmファイルとしてリソースを持つ巨大なプログラムをインストールしています。の行で立ち往生 #!/bin/sh SCITEGICPERLBIN=`dirname $0` SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN` if [ $SCITEGICPERLHOME == "." ] どうやら、この構文shを使用bashしてRed Hat Linuxで動作しますがunexpected operator、Ubuntuでエラーが発生します。 bashスクリプトがrpmパッケージから取得されるため、スクリプトをに変更できません。rpmパッケージを抽出して再パックすることはできますが、そのようなスクリプトが多数ある可能性があります。 御馳走にシェルのデフォルトを変更する方法がある#!/bin/shとしてbash扱うことができ、または何か他の[オペレータは?

2
いくつかの同時コマンドの後にbashコマンドを実行しますか?
いくつかのコマンドを並行して実行したい。これらのコマンドがすべて終了したら、次のコマンドを開始します。私は次のアプローチがうまくいくと思いますが #!/bin/bash command1 & command2 & command3 && command4 しかし、そうではなかった。command4最初の3つのコマンドすべてが完全に終了したときに実行する必要があります。


6
実行前のコマンドバイナリの検証
bashスクリプトから実際に実行していることを確認する方法はありますか? (例えば:あなたのbashスクリプトは、いくつかのコマンドを呼び出していると言うtar、mail、scp、mysqldump)、あなたはそのことを確認して喜んでいるtar本当の、実際にあるtarことによって決定された、rootファイルおよび親ディレクトリの所有者と書き込み権限を持つ唯一の一つであるユーザー所有者/tmp/surprise/tarであるwww-dataかapache2所有者ではない人もいます。 確かに私PATHは環境について知っていますが、これを実行中のbashスクリプトからさらにチェックできるかどうか、そしてそうであれば、どのくらい正確に知りたいですか? 例:(擬似コード) tarfile=$(which tar) isroot=$(ls -l "$tarfile") | grep "root root" #and so on...

3
`set -e`を指定したbashスクリプトは`…&&… `コマンドで停止しません
最初のエラーでbashスクリプトset -eを停止するために使用します。 次のコマンドを使用しない限り、すべて正常に動作し&&ます。 $ cat script set -e cd not_existing_dir && echo 123 echo "I'm running! =P" $ $ ./script ./script: line 2: cd: not_existing_dir: No such file or directory I'm running! =P $ と比べて: $ cat script set -e cd not_existing_dir echo "I'm running! =P" $ $ ./script ./script: …

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