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

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

5
getoptsでオプションが渡されなかったことを検出するにはどうすればよいですか?
私はこのコードを持っています- #getoptDemo.sh usage() { echo "usage: <command> options:<w|l|h>" } while getopts wlh: option do case $option in (w) name='1';; (l) name='2';; (h) name='3';; (*) usage exit;; esac done print 'hi'$name bash getoptDemos.sh(オプションなしで)実行するhiと、関数を呼び出す代わりに印刷されますusage。w、h、l以外のオプションが指定された場合に使用方法を呼び出します。その後、オプションが指定されていない場合は機能しません。 私が使って試してみましたが?、\?、:の代わりに、*私は私が欲しかったものを達成することはできません。私はすべてがそれを使用するようdocsにgetopt言っていることを意味します?。 何が間違っていますか?
19 bash  shell  options  getopts 

4
chshを実行してもシェルは変更されません
シェルをbashからzshに変更したい。 ユーザーzolとしてログインしているときに次を実行しようとしました。 $ chsh -s /bin/zsh $ sudo chsh -s /bin/zsh zol $ su -c 'chsh -s /bin/zsh zol' # The above all results with: $ password: $ chsh: Shell not changed. # zsh exists in /etc/shells.. chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh 何が間違っているのでしょうか?どうすれば修正できますか?
19 shell  zsh  users 

2
-qはwget出力ロギングを完全にオフにしますか?
現在、Linuxサーバーで実行されているシェルスクリプトを使用して、wgetを使用してリモートWebページをダウンロードしています。これは、特定の時間に実行するようにスケジュールされているcronジョブによって実行されます。 -qオプションを追加すると、コンソールに返されるすべての出力が停止するだけでなく、wgetによるログへの書き込みまたはログファイルの作成の試行もすべて停止することを確認できますか?
19 linux  shell  wget 

2
環境変数での一重引用符と二重引用符の意味は何ですか?
.profileで次のようにいくつかの環境変数を定義しました。 MY_HOME="/home/my_user" しかし、引用符を取り除いてファイルを再ソースしない限り、変数は評価されないようです。スペースがある場合は引用符が必要であり、エスケープが望ましくない場合は一重引用符が使用されると思います。誰かが変数定義での一重引用符と二重引用符の重要性を明確にできますか?フロントティックとバックティックはどうですか?



2
シェルスクリプトは、shファイルから実行するとnot foundエラーをスローします。しかし、手動で入力した場合、コマンドは機能します
次のスクリプトを使用して、Webサイトのサイトマップを生成しようとしています。次のsh thsitemap.shようなエラーが発生して実行すると、空のsitemap.xmlファイルが作成されます。 thsitemap.sh: 22: thsitemap.sh: [[: not found thsitemap.sh: 42: thsitemap.sh: [[: not found thsitemap.sh: 50: thsitemap.sh: Syntax error: "(" unexpected しかし、同じユーザーrootがこれらの行を手動で端末にコピーして貼り付けると、エラーなく動作し、sitemap.xmlファイルにはすべてのURLが含まれます。どうしたの?どうすれば修正できますか? #!/bin/bash ############################################## # modified version of original http://media-glass.es/ghost-sitemaps/ # for ghost.centminmod.com # http://ghost.centminmod.com/ghost-sitemap-generator/ ############################################## url="techhamlet.com" webroot='/home/leafh8kfns/techhamlet.com' path="${webroot}/sitemap.xml" user='leafh8kfns' # web server user group='leafh8kfns' # web server group debug='n' …

3
bashスクリプトで新しい空のファイルを作成するにはどうすればよいですか?
出力フラグの出力ファイルが必要になるように書かれたサードパーティのPerlスクリプトを実行しています-o。 残念ながら、スクリプトには実際のファイルが必要なようです。つまり、ユーザーはfilename.txt0バイトの空のファイルを作成してから、スクリプトコマンドラインでこの空のファイルを入力する必要があります。 perl script1.pl -o filename.txt 質問:bashスクリプト内で空のファイルを作成するにはどうすればよいですか?単純に試みるperl script1.pl -o filename.txtと、スクリプトはファイルが存在しないというエラーを出します。

1
シェルで$ {$#}が$$と同じ結果を返すのはなぜですか?
最後の定位置パラメーターを設定しようとしている間に/bin/dash、試しましたecho ${$#}。驚いたことに、これはエラーにならず、$$変数の内容と同じPIDになりました。質問、なぜその構文が機能したのですか?ここでシェルが適用した構文規則は何ですか? 基本的に、私がしたことは $ set 1 2 3 4 5 $ echo ${$#} 13819 $ echo $$ 13819 どうやら、%文字もそのような構成では無視されます $ echo ${$%} 13819 しかし、*と@悪い置換誤りが発生: $ echo ${$*} sh: 10: Bad substitution $ echo ${$@} sh: 11: Bad substitution
18 shell  variable 

2
POSIXが特定のシェルビルトインで外部実装を必要とするのはなぜですか?
printfがyashの組み込みであるかどうかに関するこの質問から、POSIX標準を引用するこの答えが出てきます。 答えは、POSIX検索シーケンスは目的のコマンドの外部実装を見つけ、シェルがそれを組み込みとして実装している場合、組み込みを実行することであると指摘しています。(特別なビルトインではないビルトインの場合) POSIXには、内部実装の実行を許可する前に、外部実装が存在するというこの要件があるのはなぜですか? それは... arbitrary意的だと思うので、私は興味があります。


4
「引数をコマンドとして解釈するコマンドに信頼できないデータを渡すコマンドを実行する」
findutilsのマニュアルより: たとえば、これらの2つのコマンドなどの構成体 # risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \; 非常に危険です。この理由は、「{}」がファイル名に展開されるためです。ファイル名には、シェルに特殊なセミコロンまたはその他の文字が含まれる場合があります。たとえば、誰かがファイルを作成した場合、 /tmp/foo; rm -rf $HOME上記の2つのコマンドは誰かのホームディレクトリを削除できます。 したがって、このため、引数をさらに解釈されるコマンドとして解釈するコマンド(たとえば、「sh」)に信頼できないデータ(ファイル名など)を渡すコマンドを実行しないでください。 シェルの場合、この問題に対する巧妙な回避策があります。 # safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \; このアプローチは、すべての問題を回避することを保証するものではありませんが、攻撃者が選択したデータをシェルコマンドのテキストに置き換えるよりもはるかに安全です。 find -exec sh -c …
18 shell 

1
bashは、「IFS」変数の値に応じて動作を変更します
IFS変数をスペースに設定すると、bash複数のスペースを1つのスペースとして扱います(myprogram受け取ったコマンドライン引数を出力するプログラムです)。 IFS=" " x="hello hi world" ./myprogram $x argv[1] = hello argv[2] = hi argv[3] = world しかし、IFS変数をコンマに設定すると、bash複数のコンマが1つのコンマとして扱われません。 IFS="," x="hello,,,hi,,,world" ./myprogram $x argv[1] = hello argv[2] = argv[3] = argv[4] = hi argv[5] = argv[6] = argv[7] = world 何故ですか?
18 bash  shell 

3
引用符で囲まれた変数のオプションが失敗するのはなぜですか?
私は、bfooで変数を引用する必要があることを読みました。たとえば、$ fooではなく「$ foo」です。しかし、スクリプトを書いているときに、引用符なしでは機能するが、引用符なしでは機能しないケースを見つけました。 wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line これは動作します: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" これはしません($ wget_optionsの前後の二重引用符に注意してください): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" この理由は何ですか? 最初の行は良いバージョンです。または、この動作の原因となる隠しエラーがあると疑うべきですか? 一般に、bashとその引用がどのように機能するかを理解するための優れたドキュメントはどこにありますか?このスクリプトを書いている間、私はルールを理解するのではなく、試行錯誤のベースに取り組み始めたと感じています。


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